我有一个静态方法,它应该根据当前时间戳生成唯一的ID,如下所示。为了确保新生成的ID不与先前生成的ID相同(由于计算机非常快,毫秒数不会改变),我使用循环比较新生成的ID和先前生成的ID。如果它们相同,它将生成另一个ID。
public class Util {
protected static String uniqueID;
public static String generateUniqueID() {
SimpleDateFormat timstampFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
do {
String timestamp = timstampFormat.format(new Date());
if (!timestamp.equals(uniqueID)) {
uniqueID = timestamp;
return uniqueID;
}
} while (true);
}
}
当多线程调用该方法时,我希望上述代码能够正常工作。
如果我只是将volatile关键字放到uniqueID变量中,是否已足够?我是否仍需要有同步块?
如果有同步块但没有volatile关键字呢?
先行致谢。
添加:
如果我更改为下面的代码,那么volatile关键字是否仍然需要?
public class Util {
private static volatile String uniqueID;
public static synchronized String generateUniqueID() {
uniqueID = UUID.randomUUID().toString();
return uniqueID;
}
}
DateTimeFormatter
),而且还会出现繁忙等待。这段代码唯一可以做的事情就是把强大的计算机变成低效的风扇加热器。不要这样做,任何一个方面都不要这样做。 - Boris the Spidervolatile
不足以,我会同步方法。 - Turing85synchronized
,除了使并发代码变成同步代码之外,几乎没有其他作用。锁争用会让一个成年人哭泣... - Boris the Spider