一、Single Threaded Execution 模式介绍

简单的来说,Single threaded execution 模式描述了在一种多线程环境下各个线程对于公用资源的使用方式——任一时刻,只有一个线程可以使用该公用资源~

STE有三个关键部分:多线程公有资源唯一线程可使用;关于为什么使用多线程这个问题,答案是我们可以利用它来获得好处,这个好处就是我们系统的一部分性能将获得提高,虽然系统整体性能不一定提高,但是总是有可能的嘛。如果系统中,某一资源可以有很多,大家各自用各自的,相安无事,即没有产生公用~但是如果某些资源对系统来说负担过于沉重(比如涉及到IO、数据库连接等费时操作时,我们还是希望花一份时间比较好),或者这样的资源只能有一个(比如,一个网站的访问次数统计器,每个页面都需要使用到它,如果各自使用各自的,那么统计的就是网页访问次数了,还比如一些全局配置文件,当该文件发生变化后,系统响应部分需要得到同步更新,各自使用一个该文件肯定就不行了,还有就是唯一序列号的生成器等应用),那么就需要公用这里资源了。总体来说,STE这里的公用资源具有“不得不”只有一个或者“最好”只有一个以及”某一时刻,只能一个线程使用”的特点~

至于为什么某一时刻只能一个线程使用公用资源,这是因为某些时候多条线程同时访问公用资源(1)(想一想,什么是“同时访问”呢,如果只有一个CPU,那么某一时刻,一定只有一个线程使用公用资源,但这是STE吗?)会对公用资源造成破坏,使其失去使用价值。比如A打算把X(=10)加1后打印,理论上来说A输出X=11;但如果A把X加1后还没来得及打印就被置换出去了,B开始执行把X加1,然后输出,理论上B输出X=12,结果B的确输出X=12,这时A又被调度执行,输出的就不再是X=11,而是X=12;即B对X的访问,破坏了A对X的访问。嗯,我认为,同时访问就是指一个线程A对公用资源的一套处理流程没有全部执行完,另一个线程B就开始了对公用资源的处理。(这里再问个问题,就是在(1)处某些时候的对立面的情况下,我们还有必要使用STE吗?即是不是只要有一个公用资源,我们就必须使用STE模式使用多线程呢?其实,第一段中的定义还是比较准确的,因为STE只描述了一种方式哦~哈哈哈,算是小提示啦,同时提醒自己!);

二、Single Threaded Execution的使用场景

  1. 多线程编程环境
  2. 多个线程同时访问共享资源;
  3. 共享资源的状态会因线程的访问而改变;(换言之,如果共享资源的状态不会因为多线程访问而改变,那么就不适用STE模式啦);

三、Single Threaded Execution的实例代码及分析

// 多线程类,功能及时让来自address的那么通过gate类
public class WorkerThread extends Thread {private final Gate gate;private final String name;private final String address;public WorkerThread(Gate g,String n,String a){this.gate=g;this.name=n;this.address=a;}public void run(){System.out.println(name+" Begin");while(true){gate.pass(name,address);}}
}
//Gate 抽象类,我们将派生出线程安全的Gate和非线程安全的Gate
public abstract class Gate {int counter=0;String name="Nobody";String address="Nowhere";public abstract void pass(String name,String address);
}
//安全的Gate,嗯,不防盗,但是防多线程不安全访问~
public class SafeGate extends Gate {public synchronized String toString(){//这是一个同步方法哦return "No."+counter+": "+name+","+address;}void check(){//这里不用同步,因为该函数的调用者已经同步过啦if(name.charAt(0)!=address.charAt(0)){System.out.println("******BROKEN****** "+toString());}}@Overridepublic synchronized void pass(String name, String address) {//安全的同步门super.counter++;super.name=name;super.address=address;check();}
}
//非线程安全的Gate
public class UnSafeGate extends Gate {public void pass(String name,String address){super.counter++;super.name=name;super.address=address;check();}//该函数的执行可能被打断,而造成公用数据被修改public String toString(){System.out.println("Father toString");return "No."+counter+": "+name+","+address;}private void check(){if(name.charAt(0)!=address.charAt(0)){System.out.println("******BROKEN****** "+toString());}}
}

四、对Single Threaded Execution的理解

在面向对象程序设计领域中,大师们总结出著名的23种设计模式,江湖上自然还有若干非著名(但不一定不实用哦)的设计模式,其中单例模式就位于著名的23种当中;

当我看到STE时,感觉和设计模式中单例模式非常像,嗯,其实他们的偏重点不同,理念也不同!相同的是涉及的资源都只有一个,然而,这不是重点啊~

两者的不同之处就在于:

  1. 使用环境不同:如果在单线程环境下,我们仍然可以使用单例模式以保证系统各个部分使用的是同一个对象。而STE的大环境条件就是多线程啊~
  2. 侧重点不同:单例模式更偏向如何创建唯一一个对象~而对该对象的使用环境设定也多为单线程,即没有考虑多线程环境下访问该对象时面临的安全性问题;STE模式更偏向如何在多线程环境下安全地使用一个共享对象,至于该类的对象是否唯一并不关注。

总体来说,STE指出了多线程环境下对可变共享资源的一种访问方式,是一种多线程环境下利用互斥访问以实现线程安全的策略。

当然,具体的应用中还需要灵活地结合实际的功能需求,不过,同单例模式搭配使用的STE,味道应该很不错哦~(单例模式保证该对象全局唯一,STE保证对该对象的访问线程安全~);

多线程编程模式之Single Threaded Execution 模式相关推荐

  1. 第一章Single Threaded Execution模式 能通过这座桥的只有一个人

    [Single Threaded Execution模式] 以一个线程执行,就像独木桥同一时间内只允许一个人通行一样,该模式用于设置限制.以确保同一时间内只能让一个线程执行处理. Single Thr ...

  2. java多线程之Single Threaded Execution模式

    一.简介 所谓Single Threaded Execution模式,就是指"以一个线程执行",就像一座独木桥同一时间内只允许一个人通过一样,该模式用于设置限制,以确保同一时间内只 ...

  3. Single Threaded Execution模式

    以下是学习了<图解Java多线程设计模式>一书中记录的内容 Single Threaded Execution模式--能通过这座桥的只有一个人 Single Threaded Execut ...

  4. 一 、Single Threaded Execution 模式

    当我们修改多个线程共享的实例时,实例就会失去安全性.所以,我们应该仔细找出实例状态不稳定的范围,将这个范围设为临界区,并对临界区进行保护,使其只允许一个线程同时执行. JAVA使用synchroniz ...

  5. java single threaded_[Java多线程设计模式]读书笔记 - 第一章 Single Threaded Execution

    Single Threaded Execution是指"以1个线程执行"的意思.就像细独木桥只允许一个人通行一样,这个Pattern用来限制同时只让一个线程运行. Single T ...

  6. 多线程编程下单例模式与多例模式的使用总结

    最近研究了一下多线程在单例.多例下的使用,以及安全问题,总结如下: 1.先说一下什么是单例模式和多例模式. (1):单例模式:一个对象在内存中只有唯一个实例.它有两个主要的特点:构造函数私有,它的唯一 ...

  7. Single Threaded Execution Pattern

    如果不使用Single Threaded Exception Pattern: 门类: 人类: main: 执行结果: 为什么会有broken(损坏): Gate是非线程安全的类. 测试并无法证明安全 ...

  8. Java多线程编程模式实战指南(三):Two-phase Termination模式--转载

    本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-t ...

  9. Java多线程编程模式实战指南(二):Immutable Object模式--转载

    本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-o ...

最新文章

  1. 1070 Mooncake
  2. 关于SQLServer2005的学习笔记——XML的处理
  3. ACP-PMP备考交流
  4. SpringMVC日期类型转换问题三大处理方法归纳
  5. MySQL两千万数据优化迁移
  6. 使用tmpfs存放MySQL的临时文件的问题一则
  7. LInux:shell 彩色进度条实现(有图有代码有真相!!!)
  8. 《天天数学》连载34:二月三日
  9. linux a8启动过程,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  10. C#中导出电子表格Execl总结
  11. Linux 面试最常问的十个问题
  12. Java后端防止获取短信验证码接口被恶意调用的代码实现
  13. 对象存储、文件存储、块存储的区别和联系
  14. linux脚本课程设计通讯录,Linux简单电子通讯录源码
  15. 浅析 Hinton 最近提出的 Capsule 计划
  16. UI5:创建.yaml文件报错:无法加载文件 C:\Users\86178\AppData\Roaming\npm\ui5.ps1
  17. 浮点数打印其实是个复杂的过程
  18. Rayland-FDM打印机C200介绍
  19. 国内即时通讯工具介绍
  20. 设计高并发架构与系统多级缓存架构如何设计?

热门文章

  1. Agv、Rgv 车辆控制调度系统开发知识点篇
  2. 推荐一些实用的谷歌浏览器翻译插件
  3. 关于溢出标志OF和进/借位标志CF的判断
  4. 埃森哲2021财年第三季度全球营收达133亿美元;富士胶片创新解决方案新成员亮相CHINA PRINT 2021 | 全球TMT...
  5. 安卓模拟器绕过模拟器检测正常用电脑玩手机游戏的最好解决方法
  6. php对视频分割,视频分割软件,将一个视频分割成多段小的视频,如何对视频进行剪切...
  7. 2010上海各区排行按繁华程度
  8. dparsf是什么_老师,我用DPARSF做Slice Timeing时老报错,请问您是什么原因呢?
  9. mysql五日均线_mysql – 如何在SQL中的某个日期范围内执行移动平均线?
  10. Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_0900_as_ci,IMPLICIT) for operat