synchronized、Lock锁
Lock锁
可重入锁:ReentrantLock类
public class LockTest {
public static void main(String[] args) {
Test a = new Test("小红");
new Thread(a).start();
new Thread(a).start();
}
static class Test implements Runnable{
int ticket = 10;
String name;
public Test(String name){
this.name = name;
}
@Override
public void run() {
// synchronized (this){
// }
ReentrantLock lock = new ReentrantLock();
try {
lock.lock();
while (ticket > 0) {
Thread.sleep(100);
System.out.println(this.name + ":拿到了第"+ticket--);
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}
小红:拿到了第10
小红:拿到了第9
小红:拿到了第8
小红:拿到了第7
小红:拿到了第5
小红:拿到了第6
小红:拿到了第4
小红:拿到了第3
小红:拿到了第2
小红:拿到了第1
lock记得finally里面将lock.unlock();关闭
synchronized、lock
lock是显示锁(手动开启关闭)
synchronized是隐式锁,出了作用域自动释放锁;
lock只有代码块锁,synchronized有代码块锁、对象锁、方法锁;
lock锁,JVM花费时间更少,使用效率高,
synchronized锁使用范围更广;
优先顺序
lock > synchronized代码块 > synchronized方法锁;
死锁情况
产生死锁条件
1.互斥条件:一个资源每次只能被一个进程使用;
2.请求与保持条件:一个进程在获取其他资源阻塞时,并不释放自己占用的资源;
3.不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺;
4.循环等待条件:多个进程间形成一种头尾相接的循环等待资源关系;
例
public class SynchronizedTest implements Runnable{
// static 修饰,保证资源只一份
static JingZi jz = new JingZi();
static KouHong kh = new KouHong();
int number;
String name;
public SynchronizedTest(int number,String name){
this.number = number;
this.name = name;
}
@Override
public void run() {
getA();
}
public void getA(){
if(number == 0){
synchronized (jz){
System.out.println(this.name + ":获得了镜子的锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (kh){
System.out.println(this.name + ":获得了口红的锁");
}
}
}else{
synchronized (kh){
System.out.println(this.name + ":获得了口红的锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (jz){
System.out.println(this.name + ":获得了镜子的锁");
}
}
}
}
static class JingZi{}
static class KouHong{}
static class Test{
public static void main(String[] args) {
SynchronizedTest a = new SynchronizedTest(0,"AAA");
SynchronizedTest b = new SynchronizedTest(1,"BBB");
new Thread(a).start();
new Thread(b).start();
}
}
}
AAA:获得了镜子的锁
BBB:获得了口红的锁
两个人一人占了一个锁,都没办法进行下一步;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了