class ABC{
private static Random random = new Random();
private static AtomicLong uniqueLongId = new AtomicLong(System.currentTimeMillis());
public static long getUniqueLongId(){
long id = uniqueLongId.incrementAndGet();
long uniqueID = Math.abs(random.nextLong()) + id;
return uniqueID;
//the above code we can write in one line
//return Math.abs(random.nextLong())+uniqueLongId.incrementAndGet();
}
}
위의 getUniqueLongId() 메소드는 멀티 스레드 환경에서 고유 ID를 제공 할 것입니다. 내 관심사는 다음과 같습니다. uniqueLongId가 원자임을 알고, incrementAndGet() 호출은 스레드 안전 호출이지만 코드의 다른 부분은 동기화되지 않는다고 가정합니다. 이것은 getUniqueLongId() 메서드 자체가 스레드로부터 안전하지 않다는 것을 의미하지 않을까요? 따라서 고유 한 ID를 반드시 반환하지 않을 수도 있습니다.고유 ID를 생성하기 위해 원자를 사용하기
설명해주십시오 ..
를 스레드 안전하지 않은 것, 당신의 ID는 고유하지 않습니다. id = 1이고 무작위로 3 => uniqueId = 4/다음 실행 : id = 2이고 random은 2 => uniqueId = 4를 다시 반환한다고 가정하십시오. – assylias
예. 동의합니다. 그러나 나는 일어난 일의 기회가 아직 멀고 내 앱에 tats gud enuf라고 생각한다. 이 메소드를 사용하여 같은 id를 생성하는 abt 2 개의 즉각적인 스레드 즉,이 메소드가 스레드 안전인지 여부에 대해 더 관심이 있습니다! – anzaan