1.死锁代码示例
package com.learning.lock;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* @Author wangyouhui
* @Description 哲学家就餐问题
**/
public class PhilosopherDiningProblem {
}
/**
* 哲学家类
*/
@Slf4j
@AllArgsConstructor
class Philosopher extends Thread{
private String name;
private ChopStick left;
private ChopStick right;
@Override
public void run() {
while(true){
synchronized (this.left){
synchronized (this.right){
this.eat();
}
}
}
}
private void eat() {
log.info("{}用筷子{}和筷子{}吃了饭", this.name, this.left.getName(), this.right.getName());
}
public static void main(String[] args) {
// 5支筷子
ChopStick chopStick1 = new ChopStick("1");
ChopStick chopStick2 = new ChopStick("2");
ChopStick chopStick3 = new ChopStick("3");
ChopStick chopStick4 = new ChopStick("4");
ChopStick chopStick5 = new ChopStick("5");
// 5个哲学家
Philosopher philosopher1 = new Philosopher("阿基米德", chopStick1, chopStick2);
Philosopher philosopher2 = new Philosopher("亚里士多德", chopStick2, chopStick3);
Philosopher philosopher3 = new Philosopher("苏格拉底", chopStick3, chopStick4);
Philosopher philosopher4 = new Philosopher("柏拉图", chopStick4, chopStick5);
Philosopher philosopher5 = new Philosopher("赫拉克利特", chopStick5, chopStick1);
philosopher1.start();
philosopher2.start();
philosopher3.start();
philosopher4.start();
philosopher5.start();
}
}
/**
* 筷子类
*/
@Data
@AllArgsConstructor
class ChopStick{
private String name;
}
2.ReentrantLock处理代码示例
package com.learning.lock;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author wangyouhui
* @Description 哲学家就餐问题
**/
public class PhilosopherDiningProblem {
}
/**
* 哲学家类
*/
@Slf4j
@AllArgsConstructor
class Philosopher extends Thread{
private String name;
private ChopStick left;
private ChopStick right;
@Override
public void run() {
while(true){
if(this.left.tryLock()){
try {
if (this.right.tryLock()) {
try {
this.eat();
} finally {
this.right.unlock();
}
}
}finally {
this.left.unlock();
}
}
}
}
private void eat() {
log.info("{}用筷子{}和筷子{}吃了饭", this.name, this.left.getName(), this.right.getName());
}
public static void main(String[] args) {
// 5支筷子
ChopStick chopStick1 = new ChopStick("1");
ChopStick chopStick2 = new ChopStick("2");
ChopStick chopStick3 = new ChopStick("3");
ChopStick chopStick4 = new ChopStick("4");
ChopStick chopStick5 = new ChopStick("5");
// 5个哲学家
Philosopher philosopher1 = new Philosopher("阿基米德", chopStick1, chopStick2);
Philosopher philosopher2 = new Philosopher("亚里士多德", chopStick2, chopStick3);
Philosopher philosopher3 = new Philosopher("苏格拉底", chopStick3, chopStick4);
Philosopher philosopher4 = new Philosopher("柏拉图", chopStick4, chopStick5);
Philosopher philosopher5 = new Philosopher("赫拉克利特", chopStick5, chopStick1);
philosopher1.start();
philosopher2.start();
philosopher3.start();
philosopher4.start();
philosopher5.start();
}
}
/**
* 筷子类
*/
@Data
@AllArgsConstructor
class ChopStick extends ReentrantLock {
private String name;
}