public class Test {
    public static void main(String[] args){
//        FlightSercurityTest.test();
//        EatNoodleThread.test();
        EatNoodleThread1.test();
    }
}

/*
    16.1.1 非线程安全
 */
class FlightSecurity{
    private int count = 0;
    private String boardingPass = "null";
    private String idCard = "null";

    public synchronized void pass(String boardingPass, String idCard) {
        this.boardingPass = boardingPass;
        this.idCard = idCard;
        this.count++;
        check();
    }

    private void check(){
        if (boardingPass.charAt(0) != idCard.charAt(0)) {
            throw new RuntimeException("---Exception---"+toString());
        }
    }

    @Override
    public String toString() {
        return "FlightSecurity{" +
                "count=" + count +
                ", boardingPass='" + boardingPass + '\'' +
                ", idCard='" + idCard + '\'' +
                '}';
    }
}

class FlightSercurityTest{
    static class Passenagers extends Thread{
        private final FlightSecurity flightSecurity;
        private final String isCard;
        private final String boardingPass;

        public Passenagers(FlightSecurity flightSecurity, String isCard, String boardingPass) {
            this.flightSecurity = flightSecurity;
            this.isCard = isCard;
            this.boardingPass = boardingPass;
        }

        public void run(){
            while (true){
                flightSecurity.pass(boardingPass,isCard);
            }
        }
    }

    public static void test(){
        final FlightSecurity f= new FlightSecurity();
        new Passenagers(f,"A","A").start();
        new Passenagers(f,"B","B").start();
        new Passenagers(f,"C","C").start();
    }
}

/*
    16.3 吃面问题
 */
class Tableware{
    private final String toolName;

    public Tableware(String toolName) {
        this.toolName = toolName;
    }

    @Override
    public String toString() {
        return "Tableware: "+toolName;
    }
}

class TablewarePair{
    private final Tableware left;
    private final Tableware right;

    public TablewarePair(Tableware left, Tableware right) {
        this.left = left;
        this.right = right;
    }

    public Tableware getLeft(){
        return left;
    }

    public Tableware getRight(){
        return right;
    }
}

class EatNoodleThread extends Thread{
    private final String name;

    private final Tableware left;
    private final Tableware right;

    public EatNoodleThread(String name, Tableware left, Tableware right) {
        this.name = name;
        this.left = left;
        this.right = right;
    }

    public void run(){
        while(true){
            this.eat();
        }
    }

    private void eat(){
        synchronized (left){
            synchronized (right){
                System.out.println(name+" take up "+left+"(left)");
                synchronized (right){
                    System.out.println(name+" take up "+right+"(right)");
                    System.out.println(name+" is eating now.");
                    System.out.println(name+" put down "+right+"(right)");
                }
                System.out.println(name+" put down "+left+"(left)");
            }

        }
    }

    public static void test(){
        Tableware fork = new Tableware("fork");
        Tableware knife = new Tableware("knife");
        new EatNoodleThread("Big",fork,knife).start();
        new EatNoodleThread("Little",knife,fork).start();
    }
}

class EatNoodleThread1 extends Thread{
    private final String name;
    private final TablewarePair pair;

    public EatNoodleThread1(String name, TablewarePair pair) {
        this.name = name;
        this.pair = pair;
    }

    public void run() {
        while (true) {
            this.eat();
        }
    }

    private void eat(){
        synchronized (pair){
            System.out.println(name+" take up "+pair.getLeft()+"(left)");
            System.out.println(name+" put down "+pair.getRight()+"(right)");
            System.out.println(name+" is eating now.");
            System.out.println(name+" take up "+pair.getLeft()+"(right)");
            System.out.println(name+" put down "+pair.getLeft()+"(left)");
        }
    }

    public static void test(){
        Tableware fork = new Tableware("fork");
        Tableware knife = new Tableware("knife");
        TablewarePair pair = new TablewarePair(fork,knife);
        new EatNoodleThread1("A",pair).start();
        new EatNoodleThread1("B",pair).start();
    }
}

最新文章

  1. 有关Javascript的length()函数
  2. PinPhoto On OS X
  3. jQuery--each遍历使用方法
  4. maven的一些常用配置
  5. Agile.Net 组件式开发平台 - 系统文档中心
  6. C#中的几个线程同步对象方法
  7. SIM卡读卡器的研究与设计
  8. 针对IE的CSS样式hack
  9. Unity3D ——强大的跨平台3D游戏开发工具(一)
  10. oracle10g 基于linux6安装问题收集
  11. 购物网站首页(学习ING)
  12. 【设计模式+原型理解】第一章:使用Javascript来巧妙实现经典的设计模式
  13. SDL 开发实战(五): SDL 纹理渲染
  14. go标准库的学习-strconv-字符串转换
  15. SpringBoot 整合携程Apollo配置管理中心
  16. active在iphone上不起作用
  17. vue2.* 事件 定义方法 执行方法 获取数据 改变数据 执行方法传值 以及事件对象 05
  18. HotSpot JVM 常用配置设置
  19. Spring事件监听Demo
  20. easyui 获取当前页签选中的名称

热门文章

  1. Win8Metro(C#)数字图像处理--2.17图像木刻效果
  2. UI设计师必收!同行总结可即刻上手的iOS规范参考
  3. 一键增加swap空间脚本
  4. python中的基本数据类型之字典
  5. Adobe cs6 全系列软件绿色破解版-一键安装
  6. 由django请求生命周期延伸出的知识点大总结
  7. iOS App开发的那些事儿2:如何搭建合适的框架
  8. Python自学day-7
  9. Product Backlog:终极任务清单
  10. 漫谈Redis分布式锁实现