网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
return accounts.length;
}
}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
结果:
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
以上代码,具有一定的死锁风险。比如线程1 需要线程2转1000块,线程2需要线程1转1000块,两者都等待对方转1000块,才有足够的钱进行转账,会造成**死锁**
**死锁**:2或多个已经锁定的线程都在阻塞,等待对方释放锁,造成循环等待。比如1号房间钥匙扔2号房间,2号房间钥匙扔三号房间,3号房间钥匙扔1号房间,然后把三个房间的都关好,则三个房间都无法打开,造成死锁。
### **14.5.5 synchronized**
锁和条件的用途:
🍉唯一:任何时间只有一个线程进行执行
🍉可控:锁可以管理进入保护段的线程
🍉条件:可以加入一个或多个条件对象
🍉阻塞:条件可阻塞代码段继续运行
可使用 synchronized 方法,保护整个方法,也就是说相当于前后加锁解锁:
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
public void transfer(int from, int to, double amount) throws InterruptedException {
bankLock.lock();
while(accounts[from] < amount)
sufficientFunds.await();
try{
System.out.print(Thread.currentThread());
accounts[from] -= amount;
System.out.printf(" %10.2f from %d to %d", amount, from, to);
accounts[to] += amount;
System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());
sufficientFunds.signalAll();
}finally {
bankLock.unlock();
}
}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
等价于:
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
public synchronized void transfer(int from, int to, double amount) throws InterruptedException {
while(accounts[from] < amount)
sufficientFunds.await();
System.out.print(Thread.currentThread());
accounts[from] -= amount;
System.out.printf(" %10.2f from %d to %d", amount, from, to);
accounts[to] += amount;
System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());
sufficientFunds.signalAll();
}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
那如果用了非 Lock, 如何进行阻塞呢?这就要用到 Obejct 类的相关方法:
🍉 notifyAll() 等价于 signalAll()
🍉 notify() 等价于 signal()
🍉 wait() 等价于 await()
锁与条件的局限性:
🍉 阻塞线程不能中断
🍉 锁不能设定超时时间
🍉 所得条件比较单一
作者的建议:
🍉 Lock+Condition 和 synchronized 两种方法都不够优秀,后续会介绍更好的方法;
🍉 尽量用 synchronized , 减少出错几率
🍉 特别需要指定锁时(比如可重入锁特性),才使用 Lock+Condition
**相关内容:选择 《Java核心技术 卷1》查找相关笔记**
评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**