Java线程安全的实现方法

来源:互联网 发布:java md5 32加密算法 编辑:程序博客网 时间:2024/06/05 00:48

当我们说线程安全的时候,我们到底在说什么?

Google上给出的概念是:如果一个对象能被多个线程安全的同时使用,那该对象就是安全的。《Java Concurrency Practice》一书中给出的定义是:当多个线程访问同一个对象时,如果不考虑这些线程在运行时环境如何调度和交替执行,也不需要额外的同步,或者在调用方进行其他任何的协调操作,调用该对象都能得到正确的结果,那该对象就是线程安全的。


Java中线程安全的实现方式:

1. 悲观锁:synchronized关键字,lock 都属于悲观锁。

悲观锁是指,一个线程在访问某对象时,必须对对象加锁禁止其他对象的访问或者修改,否则假定一定会出现错误。很显然,该假设太强,所以会对系统的效率造成一定的损失,尤其是在多读的环境中。

2.乐观锁:

乐观锁是指,线程对更新保持一个乐观的态度,即假设修改某对象不会出现同步错误而不加锁,而出现同步错误再返回错误。错误检测的实现主要通过版本号的比较来实现。Hibernate框架中,可以选择事务加锁类型为乐观锁还是悲观锁。


3.volatile关键字

volatile关键字主要保证了有序性和可见性,但是对操作的原子性并不能保证,所以在使用volatile关键字替代锁机制的时候,需要两个条件:即对volatile变量的修改既不取决于变量的当前状态,也不取决于程序的当前状态。


4.concurrent包内的其他线程安全的类:如原子类,concurentHashMap等等

0 0
原创粉丝点击