java 线程之synchronized,volatile,原子类,Lock锁相关

开撸啦!!!!!

提起多线程那必然要提起线程安全、同步策略等一系列问题,咱们就从同步入手看看线程这些个玩意
首先不得不提老祖宗synchronized,如果不考虑性能问题,这真是万能的,方法有线程安全问题?加上,代码有线程安全问题?加上,尼玛你还哪里不能加。不过虽然好用但是代价也得挺大的,被称为重量级锁,各种互斥,一个线程进来其他线程等着,不服也等着。虽然后来进行了优化,加入什么自旋锁,偏向锁,轻量级锁,但是只要线程一多,竞争锁比较激烈,别话不说先膨胀为重量级锁再说,话说多线程问题哪里有说我就1个线程在那里玩。那有没有轻量级一点的,有啊,volatile,保证变量线程间可见,这货绝对轻量级。加在变量上,只要线程对变量修改,马上同步到主内存,只要用到这个变量,先把自己的变量舍弃从主内存加载,要不说是线程可见的,如果这骚操作还不能可见就见鬼了,就相当于线程只要用,我就在主内存中拿最新的。虽然被修饰的变量在个线程之间不存在一致性问题(可以看作都一致),但是java中的运算可并非都是原子操作,就一个简单的i++,如果i被volatile修饰,对,是能保证取到i的值是正确的,但是其他线程已经改变了i的值,这可绝对有问题。所以如果被volatile修饰的变量在多线程下进行了非原子性的写操作还是需要加锁的。另外volatile还可以禁止指令重排序,虽然降低了性能,但是却保证了安全,比如两个线程a要改变一个状态,b要根据a线程做的事和改变的状态去做一些事情,如果不加volatile导致状态提前改变就大发了。这里好像volatile没啥用啊,下面举个例子volatile完美控制并发,一个线程写其他线程读
        volatile boolean shutdown;
	public void shutdown() {
		shutdown=true;
	}
	public void doWork() {
		while(!shutdown) {
			//do some
		}
	}

上面例子只要shutdown被调用,能保证所有线程执行doWork方法都立刻停下来。
写了这么多总结一下synchronized和volatile的区别与联系:
synchronized:保证修饰代码的原子性和可见性, 原子性意味着,在某个时刻只有一个线程能够执行一段代码。可见性意味着,在一个线程修改变量后并且释放锁,后一个线程获取锁得到的变量是最新的。
volatile:只能保证可见性, 主要作用是使变量在多个线程间可见
再说一下应用场景:

synchronized:基本可以在任何场景下运用,没有什么局限性
volatile:如果想利用其完美控制线程安全并且不加锁必须满足两个条件,一是对变量的写操作不依赖当前值,二是变量不需要与其他的状态变量共同参与不变约束。

所以volatile的局限性是很大的,单个变量的更新都不能保证线程安全比如i++,java从1.5版本开始提供了一种用法简单,性能高效,线程安全更新一个变量的方式-----原子类,这些个类用于对变量进行更新操作并保证其原子性。原子类很多并且用法都类似这里不多说。
貌似说到这里已经很好了,变量只保证可见性,一写多读用volatile;变量需要做某些操作,如自增,改变值,这里就用原子类去更新;其他场景下比如对某个方法保证原子,对某个代码块保证原子就用synchronized,这岂不是美滋滋,但是synchronized可是重量级锁,在竞争激烈的情况下的性能下降的不是一点半点,而且它只由jvm控制,你只要加上就行,某些场景下还是不适用的。
Lock是在1.5版本后加入的,采用代码的方式实现了synchronized的功能斌且并且给予扩展,可以实现公平性,非阻塞获取锁,能被中断的获取锁,超时获取锁。Lock虽然比synchronized复杂但是比较灵活,可控。
大体介绍了下四者的区别,暂时就到这里
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackson陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值