并发原理1

  1. volatile 是如何来保 性?
           如果 声明了 volatile 行 写 操作, JVM 就会向 理器 送一条 Lock 的指令,将 量所在 存行的数据 写回到系 内存。
       每个 理器通 嗅探在 总线 播的数据来 检查 自己 存的 是不是 期了,当 理器 发现 自己 存行 对应 的内存地址被修改,就会将当前 理器的 存行 置成无效状 态。
       当 理器 对这 个数据 行修改操作的 候,会重新从系 内存中把数据 理器 里。



  1. Synchonized JVM 里的 实现 原理?
                JVM 基于 入和退出 Monitor 象来 实现 方法同步和代 码块 同步
          代 码块 同步是使用 monitorenter monitorexit 指令 实现
           monitorenter 指令是在 编译 后插入到同步代 码块 的开始位置,而 monitorexit 是插入到方法 和异常 JVM 要保 每个 monitorenter 对应 monitorexit 与之配 。任何 象都有 一个 monitor 与之关 ,当且一个 monitor 被持有后,它将 定状 线 monitorenter 指令 ,将会 尝试获 象所 对应 monitor 的所有 ,即 尝试获 象的







happens-before 规则
1 )程序 规则 :一个 线 程中的每个操作, happens-before 该线 程中的任意后 操作。
2 监视 锁规则 一个 的解 happens-before 于随后 对这 的加
3 volatile 规则 一个 volatile 域的写, happens-before 于任意后 续对这 volatile 域的
4 传递 性:如果 A happens-before B ,且 B happens-before C ,那么 A happens-before C
5 start() 规则 :如果 线 A 行操作 ThreadB.start() (启 动线 B ),那么 A 线 程的 ThreadB.start() 操作 happens-before 线 B 中的任意操作。
6 join() 规则 :如果 线 A 行操作 ThreadB.join() 并成功返回,那么 线 B 中的任意操作 happens-before 线 A ThreadB.join() 操作成功返回。










public class SafeDoubleCheckedLocking {
     private volatile static Instance instance;
     public static Instance getInstance() {
          if (instance == null) {
               synchronized (SafeDoubleCheckedLocking.class) {
                    if (instance == null)
                         instance = new Instance(); // instance为volatile,现在没问题了
               }
          }
          return instance;
     }
}
对实 例字段使用 线 安全的延 初始化, 使用 基于 volatile 的延 初始化的方案
字段使用 线 程安全的延 初始化, 使用 基于 初始化的方案
public class InstanceFactory {
     private static class InstanceHolder {
          public static Instance instance = new Instance();
     }
     public static Instance getInstance() {
          return InstanceHolder.instance ;  // 这里将导致InstanceHolder类被初始化
     }
}









中断可以理解 为线 程的一个 标识 位属性,它表示一个运行中的 线 程是否被其他 线 了中断操作。中断好比其他 线 对该线 程打了个招呼,其他 线 程通 过调 该线 程的 interrupt()
方法 行中断操作。
线 程通 过检查 自身是否被中断来 行响 线 程通 方法 isInterrupted() 行判断是否 被中断,也可以 用静 方法 Thread.interrupted() 当前 线 程的中断 标识 行复位。
如果 线 程已 经处 终结 ,即使 该线 程被中断 ,在 该线 象的 isInterrupted() 依旧会返 false
多声明抛出 InterruptedException 的方法(例如 Thread.sleep(long  millis) 方法) 些方法在抛出 InterruptedException 之前, Java 机会先将 该线 程的中断 标识 清除,然后抛出 InterruptedException ,此 时调 isInterrupted() 方法将会返回 false











ThreadLocal ,即 线 量,是一个以 ThreadLocal 为键 、任意 为值 的存 储结 构。
构被附 线 程上,也就是 一个 线 程可以根据一个 ThreadLocal 查询 定在
线 程上的一个
可以通 set(T) 方法来 置一个 ,在当前 线 程下再通 get() 方法 取到原先 置的





























































































































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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值