JAVA并发编程笔记

  

1.并发变成的实现原理

  Volatile

    Volatile是轻量级的同步(synchronized),在多处理开发中保证了共享变量的可见性,指一个线程修改一个共享变量时,另外一个线程可以读到这个修改的值,其中instance是volatile的变量。

  实现原则

    1.Lock前缀指令会引起处理器缓存存回写到内存

    2.一个处理器的缓存回写到内存会导致其他处理器缓存无效

  synchronized(重量级锁)

    在实现同步的基础中,每一个对象可以作为锁,表现为

      1.普通同步方法,锁是当前实例对象

      2.对于同步静态方法,锁是当前CLAASS

      3.对于同步方法块,锁是Synchonized括号里配置的对象

   Synchronized的锁存在Java的对象头中,而且每个锁都有的优劣势

优点 缺点 适用场景
偏向锁

加锁和解锁不需要额外的消耗,

和执行非同步方法相比仅存在纳秒级的差距

如果线程存在竞争会带来

额外的锁撤销消耗

一个线程

访问同步块场景

轻量级锁

竞争的线程不会阻塞,提高了程序的

响应速度

如果始终得不到锁竞争的线程,

使用自旋会消耗cpu

追求响应时间

同步块执行速度非常快

重量级锁  线程竞争不使用自旋,不会消耗cpu 线程阻塞,响应时间缓慢

追求吞吐量

同步块时间执行速度较长

  

      并发编程模型

    在并发编程中,需要处理两个问题,线程之间如何通信及线程之间如何同步,线程之间氛围,共享内存和消息传递

  1.共享内存的并发模型中,线程之间共享程序的公共状态,通过写读内存中的公共状态进行隐式通信,在消息传递的并发模型中,线程之间没有公共状态,线程之间必须通过发送消息来显示进行通信

  2.同步指程序中用于控制不同线程之间操作发生相对顺序的机制,在共享内存并发模型里,同步是显式进行的.

  而并发采用的是共享内存模型,Java线程之间通信总是隐式进行,过程对程序员完全透明,所以如果不了解通信机制时会产生内存可见性问题

    JMM

  java线程之间的通信由内存模型控制,jmm定义了线程和主内存之间的抽象关系,线程之间共享变量存储在主内存,每一个线程都有一个本地内存,本地内存中存储了该线程以读写共享变量的副本。

  happens-before

  用来定义分布式系统中事件的篇序关系,jmm通过happens-before关系向程序员提供跨线程的内存可见性保证.保证多线程执行结果不被改变

  as-if-serial保证了但线程内程序的执行结果不被改变。

      

原文地址:https://www.cnblogs.com/EraserHead/p/6434783.html