Java 多线程进阶——并发安全、死锁与生产者消耗者模子

[复制链接]
发表于 昨天 21:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  • 为什么须要线程同步?
当多个线程同时修改同一个变量(比方银行账户余额)时,大概会发生“数据覆盖”或“读取脏数据”的情况。这就比如两个人同时去改同一份文档,如果不加锁,末了的效果肯定是一团糟。
为了办理这个标题,Java 提供了线程同步机制。

  • 给代码加把锁:synchronized
synchronized是Java中最常用的同步关键字,它能包管同一时候只有一个线程能实行被锁住的代码块。
同步方法:直接在方法声明上加  synchronized ,锁的是当前对象 ( this )。
同步代码块: synchronized(obj) { ... } ,锁的是括号里的对象  obj 。
原理:这就像上茅厕,门上的锁就是  synchronized 。一个人进去了(获取锁),其他人只能在外貌等(壅闭),直到内里的人出来(开释锁)。

  • 鉴戒!多线程的噩梦——死锁
死锁是指两个或多个线程相互持有对方须要的资源,而且都在等候对方开释,导致全部线程都无法继续实行。
死锁产生的四个须要条件:
互斥条件:资源只能被一个线程占用。
哀求与保持条件:占着碗里的,看着锅里的。
不剥夺条件:资源只能由持有者主动开释。
循环等候条件:A 等 B,B 等 A,形成闭环。
制止死锁最简朴的方法是粉碎“循环等候条件”,比如规定全部线程必须按照雷同的序次获取锁。

  • 经典实战:生产者消耗者模子
场景:有一个堆栈(缓冲区),生产者负责生产产物放入堆栈,消耗者负责从堆栈取走产物。
规则:
堆栈满了,生产者必须克制生产(等候)。
堆栈空了,消耗者必须克制消耗(等候)。
一旦有变更,须要关照对方。
焦点方法共同:
wait() :线程进入等候状态,开释锁。
notify()  /  notifyAll() :唤醒正在等候的线程。
在这个模子中,我们通常使用  Object  类的  wait/notify  机制,大概使用更高级的  BlockingQueue (壅闭队列)来实现解耦。

免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表