请考虑从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即将换行则抛出异常.
volatile在生成generateSerialNumber后我们可以删除synchronized它,因为它是多余的.但是,它会造成什么伤害吗?如果我同时具有同步和易失性,则会有任何性能损失private static volatile int nextSerialNumber = 0;
public static synchronized int generateSerialNumber() {
return nextSerialNumber++;
}
Run Code Online (Sandbox Code Playgroud)
它只是意味着long将包含比int更多的数字.
如果nextSerialNumber即将换行,则抛出异常
意味着这里的问题是你的数字用完了,最终会出现溢出.你想确保不会发生这种情况.问题是,如果您处于可能的最大整数并且递增,则程序不会失败.它很高兴不会增加,但结果不再正确.
使用long将推迟这种可能性.抛出异常将表明它已经发生.
| 归档时间: |
|
| 查看次数: |
476 次 |
| 最近记录: |