java并发相关内容汇总
2017-03-20 19:19
288 查看
1.计算机资源
对计算机而言,其可支配的资源有限。目前的计算机在单核性能提升的发展道路上似乎走到了尽头,因此摩尔定律更多的体现在多核甚至单机多CPU。多核计算机要发挥最大效益,便要求程序员在编码过程中尽量的使用并发编程。计算机的并发运行需要程序员关注资源的使用,防止出现各种意想不到的问题。
2.死锁及其危害
死锁的原因在于资源的不够用,要是资源能无限满足的话,也就不会出现死锁,然而这是不可能的。既然资源有限,而计算机的处理能力很强,可同时运行大量的线程以达到并发的需求,我们需要控制资源的利用使得资源被每个线程安全访问。
举一个出现死锁的例子,计算机产生4个线程,每个线程需要两个A资源才能正常运行,而目前计算机只有4个A资源。极端情况下(很容易发生)每个线程都拿到一个A资源,向系统索求第二个A资源,此时便出现了死锁。
一旦发生了死锁,四个线程同时处于僵死状态,无疑对系统的而言是灾难性的。
3.线程安全机制
3.1锁机制
目前jdk支持两种锁机制,一种是内置锁(synchronized),一种是重入锁(reentrantlock)。在jdk1.5之前,内置锁性能没有重入锁性能好,但优化后,内置锁性能明显好于重入锁,因此我们应该尽量使用内置锁。为什么叫重入锁呢,因为对于同一线程而言,可以重复加锁,但加了多少次锁就要解锁多少次。
重入锁相对于内置锁的优势在于重入锁可以对加锁进行控制,比如添加时间参数,过了规定的时间便放弃加锁,或者使用lock.interruptibly()使得锁支持中断响应。
此外jdk还实现了锁分离机制,比如ReadWriteLock可实现读写锁分离,读操作间不会互相影响。信号量机制(semaphore),倒计时器(countDownLatch),循环栅栏(cyclebarrier), 线程阻塞工具类(LockSupport).要注意LockSupport.park(),LockSupport.unpark()和Thread.suspend(),Thread.resume()的区别。
3.2无锁机制
无锁方式靠的是CAS,CAS即比较和交换。sun.misc.Unsafe这个指针被很多jdk并发类使用,unsafe使用的就是CAS方式,因此性能上要优于锁。CAS的原理是,输入期望值和替换值,如果期望值和原有的值相等则用替换值替换原有值,否则循环等待直到替换成功。
volatile属于轻量级的同步工具,保证了变量值对线程的可见性。说到volatile,便要谈起JMM(java内存模型), 每个线程有其特有的内存空间,也有共有的内存空间,volatile保证每次写数据都会将数据直接写入共有内存空间,读内容时也会直接去共有内存空间读取,以此达到改变对所有线程可见效果。
最好的无锁机制是不可变,一个类一旦成为了不可变类便可认为其是线程安全的。
3.3jdk并发应用
Collections.synchronized(List)返回并发容器,使用代理模式实现; ConccurrentHashMap减小了锁粒度,使用volatile、final、CAS等大量无锁话同步机制,当然也有显示锁的使用;ConcurrentListQueue使用CAS方式实现并发,高效。Atomic方式的数据或者对象封装
3.4ThreadLocal类的使用
ThreadLocal内部实现是一个Map,key为当前线程的名称或其他唯一标识,value为要保存的信息内容。确保了对每一个线程都有其特有的信息内容。
对计算机而言,其可支配的资源有限。目前的计算机在单核性能提升的发展道路上似乎走到了尽头,因此摩尔定律更多的体现在多核甚至单机多CPU。多核计算机要发挥最大效益,便要求程序员在编码过程中尽量的使用并发编程。计算机的并发运行需要程序员关注资源的使用,防止出现各种意想不到的问题。
2.死锁及其危害
死锁的原因在于资源的不够用,要是资源能无限满足的话,也就不会出现死锁,然而这是不可能的。既然资源有限,而计算机的处理能力很强,可同时运行大量的线程以达到并发的需求,我们需要控制资源的利用使得资源被每个线程安全访问。
举一个出现死锁的例子,计算机产生4个线程,每个线程需要两个A资源才能正常运行,而目前计算机只有4个A资源。极端情况下(很容易发生)每个线程都拿到一个A资源,向系统索求第二个A资源,此时便出现了死锁。
一旦发生了死锁,四个线程同时处于僵死状态,无疑对系统的而言是灾难性的。
3.线程安全机制
3.1锁机制
目前jdk支持两种锁机制,一种是内置锁(synchronized),一种是重入锁(reentrantlock)。在jdk1.5之前,内置锁性能没有重入锁性能好,但优化后,内置锁性能明显好于重入锁,因此我们应该尽量使用内置锁。为什么叫重入锁呢,因为对于同一线程而言,可以重复加锁,但加了多少次锁就要解锁多少次。
重入锁相对于内置锁的优势在于重入锁可以对加锁进行控制,比如添加时间参数,过了规定的时间便放弃加锁,或者使用lock.interruptibly()使得锁支持中断响应。
此外jdk还实现了锁分离机制,比如ReadWriteLock可实现读写锁分离,读操作间不会互相影响。信号量机制(semaphore),倒计时器(countDownLatch),循环栅栏(cyclebarrier), 线程阻塞工具类(LockSupport).要注意LockSupport.park(),LockSupport.unpark()和Thread.suspend(),Thread.resume()的区别。
3.2无锁机制
无锁方式靠的是CAS,CAS即比较和交换。sun.misc.Unsafe这个指针被很多jdk并发类使用,unsafe使用的就是CAS方式,因此性能上要优于锁。CAS的原理是,输入期望值和替换值,如果期望值和原有的值相等则用替换值替换原有值,否则循环等待直到替换成功。
volatile属于轻量级的同步工具,保证了变量值对线程的可见性。说到volatile,便要谈起JMM(java内存模型), 每个线程有其特有的内存空间,也有共有的内存空间,volatile保证每次写数据都会将数据直接写入共有内存空间,读内容时也会直接去共有内存空间读取,以此达到改变对所有线程可见效果。
最好的无锁机制是不可变,一个类一旦成为了不可变类便可认为其是线程安全的。
3.3jdk并发应用
Collections.synchronized(List)返回并发容器,使用代理模式实现; ConccurrentHashMap减小了锁粒度,使用volatile、final、CAS等大量无锁话同步机制,当然也有显示锁的使用;ConcurrentListQueue使用CAS方式实现并发,高效。Atomic方式的数据或者对象封装
3.4ThreadLocal类的使用
ThreadLocal内部实现是一个Map,key为当前线程的名称或其他唯一标识,value为要保存的信息内容。确保了对每一个线程都有其特有的信息内容。
相关文章推荐
- Java 与并发相关的系统原理 —— 参考博客文章链接汇总
- Java并发与线程相关资源汇总
- java构造方法的相关内容
- JAVA笔试相关知识点汇总【持续增加中】
- [Java] ThreadLocal相关内容
- IOS相关培训机构课程内容汇总
- java3d相关资源的链接汇总
- 谈谈Java中的构造函数的初始化及相关内容
- Android百度地图相关内容汇总
- 黑马程序员_Java基础_平台搭建相关内容
- Java中Date及Timestamp时间相关内容
- Android百度地图相关内容汇总
- 读取本机的Java运行环境和相关配置文件的内容 推荐
- java中的继承相关内容
- java并发也许你不知道的一些内容(读Java Concurrency in Practice)(转)
- 转:Java中Date及Timestamp时间相关内容
- Flash Player 10 相关内容汇总
- 2010年会计从业资格考试相关内容汇总(全国各地)
- Java 并发及同步相关 Synchronized ReentrantLock
- Java中Date及Timestamp时间相关内容