Single Thread Execution设计模式
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设计模式的更多相关文章
- 多线程系列之二:Single Thread Execution 模式
一,什么是SingleThreadExecution模式?同一时间内只能让一个线程执行处理 二,例子 1.不安全的情况 用程序模拟 三个人频繁地通过一个只允许一个人经过的门.当人通过时,统计人数便会增 ...
- Single Thread Execution 能通过这座桥的只有一个人
直奔主题, Single Thread Execution也称作Critical Section(临界区),范例如下: public class SingleThreadGate { public s ...
- JAVA并发设计模式学习笔记(二)—— Single Threaded Execution Pattern
注:本文的主要参考资料为结城浩所著<JAVA多线程设计模式>. 单线程执行模式(Single Threaded Execution Pattern)是最简单的多线程设计模式,几乎所有其他的 ...
- 多线程设计模式(一) Single Threaded Execution
这里有一座独木桥.因为桥身非常的细,一次只能允许一个人通过.当这个人没有下桥,另一个人就不能过桥.如果桥上同时又两个人,桥就会因为无法承重而破碎而掉落河里. 这就是Single Threaded Ex ...
- 多线程程序设计学习(2)之single threaded execution pattern
Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...
- 多线程学习之一独木桥模式Single Threaded Execution Pattern
Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...
- How does a single thread handle asynchronous code in JavaScript?
原文:https://www.quora.com/How-does-a-single-thread-handle-asynchronous-code-in-JavaScript ----------- ...
- 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 ...
- 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 ...
随机推荐
- fatal error LNK1169:找到一个或多个重定义的符号
这个算是个比较基础的问题,由于我不是C程序员,本行java,临时拉来做的,所以有些坑还得自己走出来. 这个问题是由于,全局变量在a.h中定义,在两个源文件a.cpp和b.cpp中引用,之后被编译器认为 ...
- Database time zone version is 18. It is older than current release time zone version 26
[oracle@raca1 12.2.0]$ sqlplus / as sysdba SQL Production :: Copyright (c) , , Oracle. All rights re ...
- 改善C#程序的建议7:正确停止线程
原文:改善C#程序的建议7:正确停止线程 开发者总尝试对自己的代码有更多的控制.“让那个还在工作的线程马上停止下来”就是诸多要求中的一种.然而事与愿违,这里面至少存在两个问题: 第一个问题是:正如线程 ...
- Qt项目里的源代码默认都是Unicode,原因大概是因为qmake.conf里的定义
MAKEFILE_GENERATOR = MINGWQMAKE_PLATFORM = win32 mingwCONFIG += debug_and_release debug_and_release_ ...
- Java实现Qt的SIGNAL-SLOT机制(保存到Map中,从而将它们关联起来,收到信号进行解析,最后反射调用)
SIGNAL-SLOT是Qt的一大特色,使用起来十分方便.在传统的AWT和Swing编程中,我们都是为要在 监听的对象上添加Listener监听器.被监听对象中保存有Listener的列表,当相关事件 ...
- 验证码生成器(在TImage.Canvas上写字,很好看)
生成验证码的方式有很多种,如下则是比较简单的实现,且运用了正余弦曲线来扭曲验证码字符. unit AuthenticodeGenerate; interface uses SysUtils, Wind ...
- MotionManager 陀螺仪实现方式
题外话: 权利的游戏开播了,引用一句话: 布兰:一个人如果还把,他还能勇敢么? 奈德:人在害怕时候的勇敢,才是真的勇敢. 回归正题: 说下关于 CMMotionManage ...
- Gps坐标有效性判定
百科:纬度 是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间.位于赤道以北的点的纬度叫北纬,记为N:位于赤道以南的点的纬度称南纬,记为S. var regex = new Re ...
- python机器学习系列之环境搭建
Windows系统下python2.7,numpy,matplotlib安装 1. python2.7从https://www.python.org/downloads/release/python ...
- LFS Linux From Scratch 笔记(经验非教程)
做了一个自己的DIY Linux系统.从编译每一行代码,建立每一个文件系统结构开始. 创造自己的GNU/Linux系统,不同于任何发行版.按照的教程是来自 linuxfromscratch.org 来 ...