锁:Synchronized(lock){ ... }
就好比公共厕所那单间,谁进去了就会顺手把门关了,这门就是参数lock,这单间就是这大括号,
其他人还想进这个单间的话,就得在外面等,等里面的人出了这单间,后面的人才能进去,然后也会顺手把门关了
死锁:
两个人吃饭,只有一双筷子(咱们论根算,一根叫筷子A,一根叫筷子B),
然后规定,只有同时拿着A和B才能吃东西(一根筷子不能用吧,完了还不让你直接用手抓着吃)
还规定,必须和谐竞争,不能动手抢
张三拿着A筷子,相当于张三的线程(ThreadZhang3)进入了 Synchronized(A){ ... } 代码块,
他在这个块里面,还想去拿B筷子,相当于 Synchronized(A){ Synchronized(B){//进不来} }
结果B筷子被李四拿了,相当于李四的线程(ThreadLi4)进入了 Synchronized(B){ ... } 代码块,
这时候问题就出来了,张三拿不到B筷子,又不让抢李四手里的筷子,就只能等
而李四拿了B筷子自然还想要拿A筷子,相当于 Synchronized(B){ Synchronized(A){//进不来} }
一看A筷子在张三手里,他也没辙了,俩人你看我我看你,就是没法吃饭 |