ToB企服应用市场:ToB评测及商务社交产业平台
标题:
JUC并发编程学习笔记(二)Lock锁(重点)
[打印本页]
作者:
天空闲话
时间:
2023-12-1 04:19
标题:
JUC并发编程学习笔记(二)Lock锁(重点)
Lock锁(重点)
传统的synchronized
传统的解决多线程并发导致的一些问题我们会使用synchronized关键字来解决,synchronized的本质就是队列、锁。
Lock的实现类有:可重复锁(最常用)、读锁、写锁
在创建可重复锁时,可传入boolean类型值来决定该锁是公平锁(先来后到)还是非公平锁(可插队)。
三部曲
1、创建一个锁
Lock lock = new ReentrantLock(true);
复制代码
2、加锁
lock.lock();
复制代码
3、将业务代码块包裹在try{}cath(){}finally{lock.unlock();}中
try {
if (number>0){
System.out.println(Thread.currentThread().getName()+":卖出了第"+ number-- +"张票;"+"剩余"+number+"张票");
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
复制代码
完整给一个业务加锁
class Ticket2{ private int number = 50; Lock lock = new ReentrantLock(true); public void sale(){ lock.lock(); try {
if (number>0){
System.out.println(Thread.currentThread().getName()+":卖出了第"+ number-- +"张票;"+"剩余"+number+"张票");
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
} }}
复制代码
公平锁结果
非公平锁结果
从结果上看,非公平锁和synchronized关键字效果一样。
小知识:for循环中的业务逻辑只有一条的时候可以简化大括号,直接将业务逻辑卸载后面通过分号结束。
synchronized和Lock锁的区别
synchronized是关键字,Lock锁是java的一个类
synchronized无法判断锁的状态,Lock锁可以判断是否获取到了锁
synchronized是自动的,执行完之后会自动释放锁;Lock锁必须要手动释放锁!如果不释放锁,会导致
死锁
synchronized 线程1(获得锁,阻塞)、线程2(等待,傻等死等);Lock锁在其他线程获得锁阻塞后不一定会一直等待下去。可以通过tryLock来尝试获得锁。
synchronized 可重入锁,不可以中断,非公平锁;Lock 可重入锁,可以判断锁、可以自己设置是否公平
synchronized 适合锁少量的代码同步问题;Lock 适合锁大量的代码同步
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4