Java線程死鎖代碼詳解
更新時(shí)間:2021年11月05日 10:12:19 作者:這個(gè)名字想了很久~
本篇文章主要介紹了Java線程死鎖代碼詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
/**
* @author hollis
*/
public class JStackDemo {
public static void main(String[] args) {
Thread t1 = new Thread(new DeadLockclass(true));//建立一個(gè)線程
Thread t2 = new Thread(new DeadLockclass(false));//建立另一個(gè)線程
t1.start();//啟動(dòng)一個(gè)線程
t2.start();//啟動(dòng)另一個(gè)線程
}
}
class DeadLockclass implements Runnable {
public boolean falg;// 控制線程
DeadLockclass(boolean falg) {
this.falg = falg;
}
public void run() {
/**
* 如果falg的值為true則調(diào)用t1線程
*/
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線程
*/
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("線程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("線程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é)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
springboot項(xiàng)目打包并部署到Tomcat上及報(bào)錯(cuò)處理方案
這篇文章主要介紹了springboot項(xiàng)目打包并部署到Tomcat上及報(bào)錯(cuò)處理方案,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08
spring boot jar部署控制臺(tái)日志亂碼的解決
這篇文章主要介紹了spring boot jar部署控制臺(tái)日志亂碼的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Mybatis不支持batchInsertOrUpdate返顯id問題
這篇文章主要介紹了Mybatis不支持batchInsertOrUpdate返顯id問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
使用Java生成32位16進(jìn)制密鑰的代碼實(shí)現(xiàn)
在許多加密和安全應(yīng)用中,生成隨機(jī)的密鑰是至關(guān)重要的一步,密鑰通常以16進(jìn)制形式表示,并且具有特定的長度,在這篇博客中,我們將探討如何使用Java生成一個(gè)32位長度的16進(jìn)制密鑰,并展示詳細(xì)的代碼示例和運(yùn)行結(jié)果,需要的朋友可以參考下2024-08-08

