java并发相关内容汇总

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为要保存的信息内容。确保了对每一个线程都有其特有的信息内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值