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();
    }
}

Single Thread Execution设计模式的更多相关文章

  1. 多线程系列之二:Single Thread Execution 模式

    一,什么是SingleThreadExecution模式?同一时间内只能让一个线程执行处理 二,例子 1.不安全的情况 用程序模拟 三个人频繁地通过一个只允许一个人经过的门.当人通过时,统计人数便会增 ...

  2. Single Thread Execution 能通过这座桥的只有一个人

    直奔主题, Single Thread Execution也称作Critical Section(临界区),范例如下: public class SingleThreadGate { public s ...

  3. JAVA并发设计模式学习笔记(二)—— Single Threaded Execution Pattern

    注:本文的主要参考资料为结城浩所著<JAVA多线程设计模式>. 单线程执行模式(Single Threaded Execution Pattern)是最简单的多线程设计模式,几乎所有其他的 ...

  4. 多线程设计模式(一) Single Threaded Execution

    这里有一座独木桥.因为桥身非常的细,一次只能允许一个人通过.当这个人没有下桥,另一个人就不能过桥.如果桥上同时又两个人,桥就会因为无法承重而破碎而掉落河里. 这就是Single Threaded Ex ...

  5. 多线程程序设计学习(2)之single threaded execution pattern

    Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...

  6. 多线程学习之一独木桥模式Single Threaded Execution Pattern

    Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...

  7. How does a single thread handle asynchronous code in JavaScript?

    原文:https://www.quora.com/How-does-a-single-thread-handle-asynchronous-code-in-JavaScript ----------- ...

  8. Current thread must be set to single thread apartment (STA) mode before OLE,当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”。

    Add the STAThreadAttribute attribute on the Main method. This attribute is required if your program ...

  9. C# Current thread must be set to single thread apartment (STA) mode before OLE calls can be made

    将箭头指向部分替换为编译器报错的内容即可. 参考文章:https://www.experts-exchange.com/questions/28238490/C-help-needed-Current ...

随机推荐

  1. vs2017 cordova js 签名配置

    在build.json文件中添加如下 { "android": { "release": { "keystore": "C:\\D ...

  2. Socket进阶篇

    Socket简介 1,socket是什么? 2,socket的作用 3,socket怎么用 4,socket的扩展 ——————————————————- socket是什么? Socket这个名词现 ...

  3. scala 学习

    继续学习: https://segmentfault.com/a/1190000003068853#articleHeader2 https://docs.scala-lang.org/tour/mi ...

  4. Android零基础入门第43节:ListView优化和列表首尾使用

    原文:Android零基础入门第43节:ListView优化和列表首尾使用 前面连续几期都在学习ListView的各种使用方法,如果细心的同学可能会发现其运行效率是有待提高的,那么本期就来一起学习有哪 ...

  5. 一种基于Qt的可伸缩的全异步C/S架构服务器实现(一) 综述

    本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数 ...

  6. Qt5---ftp上传功能(使用组合的办法实现功能,QNetworkAccessManager自动管理分片上传,用QLoggingCategory屏蔽SSL警告)

      从Qt的版本进化中可以知道,在Qt4中的QFtp类到了Qt5中已经没有了,虽然可以通过在Qt5中自己编译出QFtp,但是Qt5中提供的QNetworkAccessManager在发送和请求网络方面 ...

  7. 《C++ Primer》读书笔记 第二章

    1.在算数表达式中最好不要使用char或bool,只有在存放字符或布尔值时才使用他们,因为char在有些机器上是有符号的,在一些机器上是无符号的,所以特别容易出问题,如果只表示一个不大的整数,那么明确 ...

  8. 32个Python爬虫项目让你一次吃到撑

    整理了32个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1]- 微信公众 ...

  9. Spring Boot2(五):使用Spring Boot结合Thymeleaf模板引擎使用总结

    一.Thymeleaf概述 一般来说,常用的模板引擎有JSP.Velocity.Freemarker.Thymeleaf . SpringBoot推荐的 Thymeleaf – 语法更简单,功能更强大 ...

  10. mysql数据库在linux下的导出和导入及每天的备份

    mysql数据库的导出,导入 1. 导出数据库为sql文件 mysqldump 数据库名 -uroot -p > xxx.sql 导出数据表结构和数据 eg.   mysqldump cloud ...