java死锁业务场景_Java 多线程实现死锁场景

简述:

《Java 编程思想》  P718 ~ P722

模拟死锁的场景, 三个人 三根筷子,每个人需要拿到身边的两根筷子才能开始吃饭

出现死锁的场景是,三个人都拿到了右边的筷子,但是由于筷子都被抢占,均无法获得左边的筷子

Chopstick.java

package com.anialy.test.multithread.philosophers;

public class Chopstick {

private boolean taken = false;

public synchronized void take() throws InterruptedException{

while(taken)

wait();

taken = true;

}

public synchronized void drop(){

taken = false;

}

}

Philosopher.java

package com.anialy.test.multithread.philosophers;

import java.util.concurrent.TimeUnit;

public class Philosopher implements Runnable {

private Chopstick left; // 左边的筷子

private Chopstick right; // 右边的筷子

public Philosopher(Chopstick left, Chopstick right){

this.left = left;

this.right = right;

}

private void pause() throws InterruptedException {

TimeUnit.MILLISECONDS.sleep(100);

}

private void pauseToHoldChopstick() throws InterruptedException {

TimeUnit.MILLISECONDS.sleep(1000);

}

public void run() {

try {

while(!Thread.interrupted()) {

System.out.println(this + " thinking");

pause();

right.take();

System.out.println(this + " grabbing right");

// 当一个人拿起了一根筷子, 停顿一段时间,让别人也抢到各自右边的筷子

pauseToHoldChopstick();

left.take();

System.out.println(this + " grabbing left");

System.out.println(this + " eating");

pause();

// 完成之后放下筷子

right.drop();

System.out.println(this + " drop right");

left.drop();

System.out.println(this + " drop left");

}

} catch (InterruptedException e){

System.out.println(this + " exiting via interrupt");

}

}

}

死锁测试函数

DeadLockTest.java

package com.anialy.test.multithread.philosophers;

import java.io.IOException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

public class DeadLockTest {

public static void main(String[] args) throws InterruptedException, IOException {

int size = 3;

ExecutorService exec = Executors.newCachedThreadPool();

Chopstick[] sticks = new Chopstick[size];

for(int i=0; i

sticks[i] = new Chopstick();

for(int i=0; i

exec.execute(new Philosopher(sticks[i]

, sticks[(i+1) % size]));

TimeUnit.SECONDS.sleep(50);

// 关掉所有的线程

exec.shutdownNow();

}

}

测试如图,在每个线程拿到右边的筷子之后,都进入死锁等待状态

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值