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 ...
随机推荐
- 16.Oct Working Note
01 writing algorithm by assembly,but the bug... now,it runs normaly,but how to print the answer? suc ...
- lvcreate命令
lvcreate Command Examples on Linux : 1. The following command creates a logical volume 15 gigabytes ...
- 一小部分机器学习算法小结: 优化算法、逻辑回归、支持向量机、决策树、集成算法、Word2Vec等
优化算法 先导知识:泰勒公式 \[ f(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n \] 一阶泰勒展开: \[ f(x)\approx ...
- 在DBGrid增加一列CheckBox(而非DBCheckBox)
自:http://rabbitfox.blog.sohu.com/33264033.html http://community.csdn.net/Expert/topic/5342/5342920.x ...
- screen命令使用简单说明
首先用screen [-S]命令建立一个session,然后就可以在这个session中建立多个window了.使用screen [-S]可以建立多个session,而每个session又可以建立多个 ...
- Flutter学习笔记(2)--Dart语言简介
Dart简介: Dart诞生于2011年10月10日,Dart是一种"结构化的web编程"语言,Dart虽然是谷歌开发的计算机编程语言,但后来被ECMA认定位标准,这门语言用于We ...
- Spring Boot:实现MyBatis动态数据源
综合概述 在很多具体应用场景中,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库.又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动态数据 ...
- 用composer安装php代码(以安装phpmailer为例)
1.安装composer.exe软件 2.下载composer.phar 3.创建composer.json文件 { "require": { "php": & ...
- 关于CORS 应该注意的几点
前言 对于跨域,随着w3c的CORS的出现,相比较于有些年头的jsonp,CORS以其简单安全,支持post的优势越来越收到大家的欢迎.具体如何CORS的原理和实现,直接推荐阮老师的文章,十分详细.本 ...
- 先订一个小目标,把微信小程序搞懂
目标:系统性学习微信小程序. 第一阶段:熟悉微信小程序及前端开发(结合web前端学习) 第二阶段:了解设计及后端 第三阶段:学习后端.