sychronized与volatile区别?

volatile的特性:

        对单个变量的读/写可以看成锁对单个变量所做的同步。

class VolatileFeaturesExample {
  volatile long vl = 0L; // 使用volatile声明64位的long型变量
  public void set(long l) {
    vl = l; // 单个volatile变量的写
}
  public void getAndIncrement () {
    vl++; // 复合(多个)volatile变量的读/写
}
  public long get() {
    return vl; // 单个volatile变量的读
}
}

 

class VolatileFeaturesExample {
   long vl = 0L; // 64位的long型普通变量
   public synchronized void set(long l) { // 对单个的普通变量的写用同一个锁同步
    vl = l;
}
   public void getAndIncrement () { // 普通方法调用
    long temp = get(); // 调用已同步的读方法
    temp += 1L; // 普通写操作
    set(temp); // 调用已同步的写方法
}
   public synchronized long get() { // 对单个的普通变量的读用同一个锁同步
    return vl;
}
}

        可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。

        原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。

volatile写/读的内存语义:

        当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。

        通过把写线程修改的结果写入主存中,设置其他线程本地内存包含的值设置为无效,因此其他线程需要重新从主存读取来保证数据的一致性。

    对volatile变量写入与读取的过程,形式上类似线程间的通信。

sychronized:

        锁释放与volatile写有相同的内存语义,锁获取与volatile读有相同的内存语义。

sychronized与volatile区别:

  • 都具有可见性
  • 使用方面上,volatile:变量,synhronized:方法,变量
  • volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
  • volatile不会阻塞线程,synchronized会组赛线程
  • volatile标记的变量不会被编译器优化,synchronized的会被优化
  • 单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。synchronized具有原子性

 

   

        

转载于:https://my.oschina.net/u/4045381/blog/3072302

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值