`
chenhua_1984
  • 浏览: 1232984 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java 的线程安全

    博客分类:
  • java
阅读更多

     

         现代CPU基本都是多核,支持多线程工作的,每个CPU都有自己的高速缓存,多个CPU之间通过缓存一致性与主内存进行交互,Java的每个线程都有自己的工作内存,每个线程之间通过Java内存模型来和主内存交互,当多个线程同时操作或者共享同一个可变变量时,就有了我们经常提到的线程安全问题。

        

        解决线程安全的方案有几种,synchronization ,wait/notify等 其中volatile关键字有时候也被拿来解决线程安全的问题,但是根据官方的解释,volatile关键字用来修饰的变量只是对于线程的可见性,就是一个被volatie修饰的变量值被修改后,其他线程会立即知晓,但是这并不是说使用了volatile关键字就是线程安全的了。假如使用它,那么必须满足一下条件才相对安全:1 计算结果不依赖变量的当前值,或者只有一个线程来修改操作这个变量;2这个变量不需要与其他状态变量一起参与不变约束。这两个条件不是很好理解。所以为了安全起见,建议使用synchronization关键字来维护线程安全。

 

      java 对线程的控制不是绝对的,比如对线程优先级的调度,其底层实现还是交给操作系统去实现,那么在Java语言层面所作的优先级调度在不同的平台上表现可能不同,也就是这个优先级的调度并不可靠,所以有时候用优先级来调度程序是不现实的。

 

       提起synchronization关键字,这个出现的比较早,在Java5 出现了与之相竞争的reentrantLock 重入锁。reentrantLock刚出来的时候,性能比synchronization要好,但是在Java6以后,对synchronization做了优化,两次已经可以基本持平。 两个锁都为互斥锁,reentrantlock比synchronization又多了几个特性:1可中断等待 2 可实现公平锁(按时间先后),3 可以为多个条件加锁。需要手动释放。

 

 

      

 

       

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics