摘要:门的定义人的定义执行结果分析可以看到,上述类并非线程安全的,因为方法会被多个线程同时调用,且该方法中会修改类字段的值。
一、定义
Single Threaded Execution 是指“以1个线程执行”的意思,有时也称为Critical Section(临界区)。
二、模式案例案例:
假设有三个人,频繁地通过一扇门,规定每次只能通过一个人,当通过一个人时,程序会将通过的总人次加1,同时记录该次通过人的姓名和出生地。
门的定义:
public class Gate { private int counter = 0; private String name = "Nobody"; private String address = "Nowhere"; public void pass(String name, String address) { this.counter++; this.name = name; this.address = address; check(); } private void check() { if (name.charAt(0) != address.charAt(0)) { System.out.println("***** BROKEN ***** " + toString()); } } public String toString() { return "No." + counter + ": " + name + ", " + address; } }
人的定义:
public class UserThread extends Thread { private final Gate gate; private final String myname; private final String myaddress; public UserThread(Gate gate, String myname, String myaddress) { this.gate = gate; this.myname = myname; this.myaddress = myaddress; } public void run() { System.out.println(myname + " BEGIN"); while (true) { gate.pass(myname, myaddress); } } } ``` *执行:*
public class Main {
public static void main(String[] args) { System.out.println("Testing Gate, hit CTRL+C to exit."); Gate gate = new Gate(); new UserThread(gate, "Alice", "Alaska").start(); new UserThread(gate, "Bobby", "Brazil").start(); new UserThread(gate, "Chris", "Canada").start(); }
}
`
结果:
Testing Gate, hit CTRL+C to exit. Alice BEGIN Bobby BEGIN Chris BEGIN ***** BROKEN ***** No.3: Chris, Alaska ***** BROKEN ***** No.3: Chris, Alaska ***** BROKEN ***** No.3: Chris, Alaska ***** BROKEN ***** No.6: Alice, Canada ***** BROKEN ***** No.6: Alice, Canada ***** BROKEN ***** No.6: Alice, Canada ***** BROKEN ***** No.9: Bobby, Brazil ***** BROKEN ***** No.10: Bobby, Alaska
分析:
可以看到,上述Gate类并非线程安全的,因为pass方法会被多个线程同时调用,且该方法中会修改Gate类字段的值。
优化:
//将Gate类变为线程安全的类: public class Gate { private int counter = 0; private String name = "Nobody"; private String address = "Nowhere"; public synchronized void pass(String name, String address) { this.counter++; this.name = name; this.address = address; check(); } public synchronized String toString() { return "No." + counter + ": " + name + ", " + address; } private void check() { if (name.charAt(0) != address.charAt(0)) { System.out.println("***** BROKEN ***** " + toString()); } } }三、模式讲解
角色:
Single Threaded Execution 模式的角色如下:
SharedResource(共享资源)参与者
SharedResource就是多线线程会同时访问的资源类,该类通常具有2类方法:
①SafeMethod——从多个线程同时调用也不会发生问题的方法 ②UnsafeMethod——从多个线程同时调用会发生问题,这类方法需要加以防护,指定只能由单线程访问区域,即临界区(critical section)。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71488.html
摘要:介绍网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理网络存在安全漏洞等原因,都会导致网络带宽利用率不高。 介...
摘要:总之,选择单例模式就是为了避免不一致状态,避免政出多头。二饿汉式单例饿汉式单例类在类初始化时,已经自行实例化静态工厂方法饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。 单例模式有以下特点: 1、单例类只能有一个实例。 ...
摘要:它包含了你创建多线程应用的全部工具,当然无论是还是控制台程序。任何想要应用在程序里面的多线程应用必须都是继承于这几个实用类以上版本取消了类。 不分享,做一切! php拥有令人敬畏的且数量庞大的扩展跟特征,但是php当初设计这门语言的时候,是因为那个时候的web网站远远没有今天的强大!现在几乎所有的网站(含手机站)服务器都是多核的,如果不是多CPU跟多核,PHP是无法提供更好的服务的。虽...
摘要:中叫做调用栈先进后出,后进先出。如下图这是典型的内存溢出,可能会出现在某些场景下需要递归,但业务逻辑中的判断又没能正常计算进入到预设情况,于是调用栈中不断进入,又无法执行完,就造成内存溢出了。 本文主要介绍Javascript事件循环在浏览器上的一些特性和应用介绍。 Javascript小知识 JavaScript的并发模型基于事件循环(Event Loop)。这个模型与像C或者Jav...
摘要:单线程集合本部分将重点介绍非线程安全集合。非线程安全集合框架的最新成员是自起推出的。这是标准的单线程阵营中唯一的有序集合。该功能能有效防止运行时造型。检查个集合之间不存在共同的元素。基于自然排序或找出集合中的最大或最小元素。 【编者按】本文作者为拥有十年金融软件开发经验的 Mikhail Vorontsov,文章主要概览了所有标准 Java 集合类型。文章系国内 ITOM 管理平台 O...
阅读 2291·2021-11-25 09:43
阅读 2838·2021-11-24 09:39
阅读 2906·2019-08-30 11:10
阅读 1075·2019-08-29 16:34
阅读 575·2019-08-29 13:25
阅读 3342·2019-08-29 11:21
阅读 2837·2019-08-26 11:39
阅读 2374·2019-08-26 11:34