如何使用long而不是int可以防御以下方法 - Effective Java

Che*_*eng 3 java

请考虑从Joshua Bloch - Effective Java,第263页中选择的以下代码

// Broken - requires synchronization!
private static volatile int nextSerialNumber = 0;
public static int generateSerialNumber() {
    return nextSerialNumber++;
}
Run Code Online (Sandbox Code Playgroud)

修复generateSerialNumber方法的一种方法是将synchronized修饰符添加到其声明中.这确保了多个调用不会交错,并且每次调用都将看到所有先前调用的效果.完成后,您可以并且应该从nextSerialNumber中删除volatile修饰符.要防止该方法,请使用long而不是int,或者如果nextSerialNumber即将换行则抛出异常.

  1. 我知道volatile在生成generateSerialNumber后我们可以删除synchronized它,因为它是多余的.但是,它会造成什么伤害吗?如果我同时具有同步和易失性,则会有任何性能损失

private static volatile int nextSerialNumber = 0;
public static synchronized int generateSerialNumber() {
    return nextSerialNumber++;
}
Run Code Online (Sandbox Code Playgroud)
  1. 什么,使用long而不是int意味着什么?我不明白这种防弹方法怎么样?

Vin*_*nie 8

它只是意味着long将包含比int更多的数字.

如果nextSerialNumber即将换行,则抛出异常

意味着这里的问题是你的数字用完了,最终会出现溢出.你想确保不会发生这种情况.问题是,如果您处于可能的最大整数并且递增,则程序不会失败.它很高兴不会增加,但结果不再正确.

使用long将推迟这种可能性.抛出异常将表明它已经发生.