线程安全静态变量

时间:2014-08-23 15:22:45

标签: java thread-safety

我读了 thread safety for static variables我了解它,我同意它,但

在书中,java 7程序员考试804可以向我解释一下

public void run() { 
    synchronized(SharedCounter.class) { 
        SharedCounter.count++; 
    }
} 
  

但是,这个代码效率很低,因为它获取并释放了代码   每次锁定只是为了增加count的值。

有人可以向我解释上面的引用

3 个答案:

答案 0 :(得分:2)

代码效率不是特别低。它可能稍微有点效率。主要问题是它很脆弱:如果任何开发人员忘记同步其对全局SharedCounter.count变量的访问权限,则会出现线程安全问题。实际上,由于i++不是原子操作,并且由于在没有同步的情况下更改变量的值并不能使变量的新值对其他线程可见,因此每次访问i都必须在同步的方式。

因此,同步未正确封装在单个类中。通常,访问全局公共字段是糟糕的设计。在多线程环境中情况更糟。

使用AtomicInteger解决了封装问题,同时使其效率稍高。

答案 1 :(得分:0)

同步可能很昂贵,因此不应该随意使用。有更好的方法,例如使用AtomicInteger.incrementAndGet();使用不同的机制来处理同步。

答案 2 :(得分:0)

与使用可以在不使用锁定的情况下进行原子增量的内部CPU指令相比,它效率低下。请参阅http://en.wikipedia.org/wiki/Fetch-and-addhttp://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html