java-Juc并发编程系列(二):Synchronized和Lock复习加区别

第2节:Synchronized和Lock复习加区别


1.理论整理

  1. 公平锁:十分公平,遵循先来后到的原则:

  2. (java默认)非公平锁:十分不公平,可以插队,要看CPU心情

  3. SynchronizedLock 的区别:
    (1)Sychronized是内置的关键字; Lock是一个Java类
    (2) Synchronized无法判断获取锁的状态 ; Lock可以判断是否获取到了锁;
    (3)Synhronized会自动释放锁 ; Lock必须释放锁,否则会出现死锁问题;
    (4)Synhronized 线程1(获得锁) 线程2(傻傻的等) ; Lock锁就不一定会等下去,等不到就会结束了,每个线程可以通过Lock.tryLock()尝试获取锁;
    (5)Synchronized 默认就是可重入锁,不可以中断,非公平; Lock ,可重入锁,可以判断锁,在new ReentrantLock()括号中加入true关键字可以变成公平锁;在这里插入图片描述
    (6)Synchronized 适合少量的代码同步问题;Lock
    适合锁大量的同步代码;

  4. 线程也可以被唤醒而不被通知,中断或超时,即所谓的虚假唤醒,一般将if判断换成while判断

  5. 虚假唤醒解释:

一开始先调用了消费者C,D线程(因为我们写了睡眠在生产者中),消费者此时发现此时product资源为0,所以,消费者C,D这两个兄弟,没办法只能调用wait方法,睡眠了,并且释放了锁。
此时第一个生产者苏醒了,发动机开始生产产品了,并且生产之后,又唤醒了所有等待的消费者线程。消费者C,D两兄弟终于苏醒了,D哥们先获得了锁,所以就先消费了一个产品,然后就又发现没有产品了,又伤心的休眠去了,但是不要忘了,此时还有一个C哥们被唤醒了啊,你唤醒了人家,人家总的干点什么事情吧,不然这多难受,刚好不巧的是,此时的判断条件是if,所以此时C哥们便不受条件的约束,接着上面自己睡眠的代码处执行,毅然决然的又去消费了一个产品,原来D哥们消费后,就已经为0了,这个C哥们再去消费减一,不就是-1了吗,以此类推分析。发现如果判断条件用不好,此时唤醒的C哥们就相当于虚假唤醒的了,会给程序带来不可预估的错误。所以在这里判断必须要使用while.


2.实践


声明:本系列是"狂神说java"教程的个人学习笔记,无意侵权~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值