Java線(xiàn)程死鎖代碼詳解
/** * @author hollis */ public class JStackDemo { public static void main(String[] args) { Thread t1 = new Thread(new DeadLockclass(true));//建立一個(gè)線(xiàn)程 Thread t2 = new Thread(new DeadLockclass(false));//建立另一個(gè)線(xiàn)程 t1.start();//啟動(dòng)一個(gè)線(xiàn)程 t2.start();//啟動(dòng)另一個(gè)線(xiàn)程 } } class DeadLockclass implements Runnable { public boolean falg;// 控制線(xiàn)程 DeadLockclass(boolean falg) { this.falg = falg; } public void run() { /** * 如果falg的值為true則調(diào)用t1線(xiàn)程 */ if (falg) { while (true) { synchronized (Suo.o1) { System.out.println("o1 " + Thread.currentThread().getName()); synchronized (Suo.o2) { System.out.println("o2 " + Thread.currentThread().getName()); } } } } /** * 如果falg的值為false則調(diào)用t2線(xiàn)程 */ else { while (true) { synchronized (Suo.o2) { System.out.println("o2 " + Thread.currentThread().getName()); synchronized (Suo.o1) { System.out.println("o1 " + Thread.currentThread().getName()); } } } } } } class Suo { static Object o1 = new Object(); static Object o2 = new Object(); }
import org.springframework.stereotype.Component; @Component public class SynchronizedTest { private static final Object lockA = new Object(); private static final Object lockB = new Object(); /** * ThreadA先獲取lockA,在獲取lockB */ private static class ThreadA extends java.lang.Thread { @Override public void run() { // 獲取臨界區(qū)A synchronized (lockA) { System.out.println("get lockA success"); // 模擬耗時(shí)操作 try { Thread.currentThread().setName("線(xiàn)程A"); Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } // 獲取臨界區(qū)B synchronized (lockB) { System.out.println("get lockB success"); } } } } /** * ThreadB先獲取lockB,在獲取lockA */ private static class ThreadB extends java.lang.Thread { @Override public void run() { // 獲取臨界區(qū)A synchronized (lockB) { System.out.println("get lockB success"); // 模擬耗時(shí)操作 try { Thread.currentThread().setName("線(xiàn)程B"); Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } // 獲取臨界區(qū)B synchronized (lockA) { System.out.println("get lockA success"); } } } } static { new ThreadA().start(); new ThreadB().start(); } }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Bloc事件流是一個(gè)阻塞隊(duì)列結(jié)論解析
這篇文章主要為大家介紹了Bloc事件流是一個(gè)阻塞隊(duì)列結(jié)論解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11徹底搞明白Spring中的自動(dòng)裝配和Autowired注解的使用
這篇文章主要介紹了徹底搞明白Spring中的自動(dòng)裝配和Autowired注解的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03Netty框架實(shí)現(xiàn)TCP/IP通信的完美過(guò)程
這篇文章主要介紹了Netty框架實(shí)現(xiàn)TCP/IP通信,這里使用的是Springboot+Netty框架,使用maven搭建項(xiàng)目,需要的朋友可以參考下2021-07-07解決SpringBoot集成Eureka導(dǎo)致返回結(jié)果由json變?yōu)閤ml的問(wèn)題
這篇文章主要介紹了解決SpringBoot集成Eureka導(dǎo)致返回結(jié)果由json變?yōu)閤ml的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SSH框架網(wǎng)上商城項(xiàng)目第20戰(zhàn)之在線(xiàn)支付平臺(tái)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第20戰(zhàn)之在線(xiàn)支付平臺(tái),關(guān)于第三方支付的內(nèi)容從本文開(kāi)始,感興趣的小伙伴們可以參考一下2016-06-06java的Jackson將json字符串轉(zhuǎn)換成泛型List
這篇文章主要介紹了java的Jackson將json字符串轉(zhuǎn)換成泛型List ,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-02-02