我对线程之间的同步有疑问。
实际上,我有一个只读取静态变量的方法。有些线程可以访问这个变量,但没有写入,只有读取。
我是否必须声明Synchonized方法?
答案 0 :(得分:1)
同步是在读取和写入模式下访问资源时将线程排序在一起的问题。
如果未修改该值,则将此变量的评估者标记为已同步无效。
然而,如果变量是一个对象,则返回已存在属性的内部表示可能会造成损坏,因为您返回对该对象的引用。
因此,即使它是一个读取,也没有什么能阻止代码稍后更改值。
这就是为什么当您返回可变对象的内部引用时,一些错误跟踪工具会警告您。
有些本质上不可变,如字符串,整数......和所有基元(总是通过值传递)。
如果这个变量是一个可变类型,那么你可以做些什么来防止你的变异,就是在返回它之前复制变量。
例如,您需要返回myDate字段的值:
private Date myDate;
public Date getMyDate(){
// returning a copy of the myDate variable
return (this.mydate==null)?null:new Date(this.mydate.getTime());
}
答案 1 :(得分:1)
您不需要创建方法synchronized
,但如果您使用来自多个线程的某个变量(静态或非静态),则应该有适当的同步机制。
如果您只是初始化变量一次,那么只需确保safe publication即可。
如果期望偶尔写入变量,则应该消除数据争用的机会。您应该确保写入的原子性以及这些写入对读者的可见性。
synchronized
方法编写变量volatile
,如果变量是复杂对象,请确保安全发布其字段。答案 2 :(得分:0)
如果没有为变量设置新值,则应该没有它们同步。
答案 3 :(得分:0)
答案很清楚。没必要,也浪费时间。
答案 4 :(得分:0)
没有写作,只有阅读。
然后synchronization
。
然而,您应该考虑制作静态变量final
,因为您已经说过它仅用于阅读目的。此步骤将保证将来不会出现任何可能的并发危险。