1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
   | package com.redisc;
  import lombok.extern.slf4j.Slf4j;
  import java.util.concurrent.locks.ReentrantLock;
  @Slf4j(topic = "c.Run") public class Run {
      private static ReentrantLock reentrantLock = new ReentrantLock();
      public static void main(String[] args) {         Chopstick c1 = new Chopstick("1");         Chopstick c2 = new Chopstick("2");         Chopstick c3 = new Chopstick("3");         Chopstick c4 = new Chopstick("4");         Chopstick c5 = new Chopstick("5");         new Philosopher("苏格拉底", c1, c2).start();         new Philosopher("柏拉图", c2, c3).start();         new Philosopher("亚里士多德", c3, c4).start();         new Philosopher("赫拉克利特", c4, c5).start();         new Philosopher("阿基米德", c5, c1).start();     } }
  class Philosopher extends Thread {     Chopstick left;     Chopstick right;     String name;
      public Philosopher(String name, Chopstick c1, Chopstick c2) {         left = c1;         right = c2;         this.name = name;     }
      public void run() {         while (true) {                          if (left.tryLock()) {                 try {                                          if (right.tryLock()) {                         try {                             System.out.println(name + " eating...");                             Thread.sleep(1000);                         } catch (InterruptedException e) {                             e.printStackTrace();                         } finally {                             right.unlock();                         }                     }                 } finally {                     left.unlock();                 }             }         }     } }
  class Chopstick extends ReentrantLock {     String name;
      public Chopstick(String name) {         this.name = name;     }
      @Override     public String toString() {         return "筷子{" + name + '}';     } }
   |