现代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 可以为多个条件加锁。需要手动释放。
相关推荐
java线程安全总结.doc。。。。。。。。
java 线程安全的几个测试小例子,充分的理解JMM中的线程内存模型
其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。我们都知道计算机有高速缓存...
Java线程安全
JAVA线程安全及性能的优化.doc
用思维导图将Java线程安全性相关基本概念联系起来
我认为要认识java线程安全,必须了解两个主要的点:java的内存模型,java的线程同步机制。特别是内存模型,java的线程同步机制很大程度上都是基于内存模型而设定的。后面我还会写java并发包的文章,详细总结如何利用...
该资源包含了一个java线程安全以及生产者消费者demo,可以参考博客:
Java线程安全.pdf
java线程安全总结,是经过多人的经验总结出来的
java线程安全总结.pdf
java线程安全性精讲
Java 线程安全 与 锁.doc
Java线程安全[借鉴].pdf