并发系列之synchronized与volatile的区别

并发系列 专栏收录该内容
11 篇文章 0 订阅

1、使用上的区别

      volatile只能修饰变量,synchronized修饰方法和语句块;
      volatile例子:

volatile static boolean flag = true

synchronized例子:

synchronized(this){
}

synchronized static String getName() {
}

2、对原子性的保证

      synchronized能够保证原子性,volatile不能保证原子性;
      volatile例子(运行结果是不对的):

public class WtyicySynchronized implements Runnable {

    private volatile static int count = 0;

    @Override
    public void run() {
	    for (int i = 0; i < 10000; i++) {
	         count++;
	     }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            Thread thread = new Thread(new WtyicySynchronized());
            thread.start();
        }
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("result: " + count);
    }
}

      synchronized例子:

public class WtyicySynchronized implements Runnable {

    private static int count = 0;

    @Override
    public void run() {
        synchronized (WtyicySynchronized.class) {
            for (int i = 0; i < 10000; i++) {
                count++;
            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            Thread thread = new Thread(new WtyicySynchronized());
            thread.start();
        }
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("result: " + count);
    }
}

3、对可见性的保证

      均可以保证可见性,但实现原理不一样,volatile对变量加了lock,synchronized使用monitorEnter和monitorExit;
      volatile例子:ACC_VOLATILE,采用lock 汇编指令操作,lock add dword ptr [rsp],0h

 private static volatile int count;
    descriptor: I
    flags: ACC_PRIVATE, ACC_STATIC, ACC_VOLATILE

      synchronized例子:

	4: monitorenter
    5: iconst_0
    6: istore_2
    7: iload_2
    8: sipush        10000
   11: if_icmpge     28
   14: getstatic     #3                  // Field count:I
   17: iconst_1
   18: iadd
   19: putstatic     #3                  // Field count:I
   22: iinc          2, 1
   25: goto          7
   28: aload_1
   29: monitorexit

4、对有序性的保证和阻塞

      均可以保证有序性,可是synchronized并发退化到串行;synchronized引发阻塞;volatile不会引发阻塞;
      volatile例子:t1线程修改了数据,同步到祝内存中,马上就会通知其他线程,不存在线程阻塞。
      synchronized例子:t1线程拿到锁时,t2线程就不能操作,就必须等待,多个线程排队的时候,就会存在线程阻塞。


5、往期佳文

5.1、面试系列

1、吊打面试官之一面自我介绍
2、吊打面试官之一面项目介绍
3、吊打面试官之一面系统架构设计
4、吊打面试官之一面你负责哪一块
5、吊打面试官之一面试官提问
6、吊打面试官之一面你有什么问题吗

······持续更新中······


5.2、技术系列

1、吊打面试官之分布式会话
2、吊打面试官之分布式锁
3、吊打面试官之乐观锁
4、吊打面试官之幂等性问题
5、吊打面试关之分布式事务
6、吊打面试官之项目线上问题排查

······持续更新中······

5.3、源码系列

1、源码分析之SpringBoot启动流程原理
2、源码分析之SpringBoot自动装配原理
3、源码分析之ArrayList容器
4、源码分析之LinkedList容器
5、码分析之HashMap容器

5.4、数据结构和算法系列

1、数据结构之八大数据结构
2、数据结构之动态查找树(二叉查找树,平衡二叉树,红黑树)

······持续更新中······

5.5、多线程系列

1、并发系列之初识多线程
2、并发系列之JMM内存模型
3、并发系列之synchronized解析
4、并发系列之volatile解析

······持续更新中······


展开阅读全文
  • 0
    点赞
  • 3
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值