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

Single Threaded Execution Pattern【独木桥模式】

一:single threaded execution pattern的参与者
--->SharedResource(共享资源)

二:single threaded execution pattern模式什么时候使用
--->多线程程序设计时
--->数据可被多个线程访问的时候
--->共享资源状态可能变化的时候
--->需要确保数据安全性的时候

三:single threaded execution pattern思考
--->synchronized一见到它,势必保护着什么公共资源的数据。保证数据安全,就得所有该保护的地方都得保护。
--->保护公共资源的数据的范围叫临界区,临界区尽可能的小。提高性能。
--->程序设计的时候,一定要防止死锁的发生。主要是同步方法的外部调用顺序,防止交叉调用,多线程时,会发生死锁。

案例:三个人来回通过一扇门,通过时记录该人的姓名和地址。

门类(公共资源)

 1 package com.yeepay.sxf.thread1;
 2 /**
 3  * 门类(代表着多线程程序访问的公共资源)
 4  * @author sxf
 5  *
 6  */
 7 public class Gate {
 8     //计数器
 9     private int counter=0;
10     //通过这扇门的人的名字
11     private String name;
12     //正在通过这扇门的人的地址
13     private String address;
14     //通过这扇门的动作
15     //存在多线程同时访问该资源。(临界区需要做同步)
16     public synchronized void passGate(String name,String address){
17         counter+=1;
18         this.name=name;
19         this.address=address;
20         check();
21     }
22     //记录通过这扇门的人的信息
23     @Override
24     public String toString() {
25
26         return "NO:"+counter+"人   name="+name+"  address="+address;
27     }
28
29     //检查,如果数据不完整,说明多线程程序的安全性挂掉。打印报警信息
30     private void check(){
31         if(name.charAt(0)!=address.charAt(0)){
32                 System.out.println("**********breaken*******"+toString());
33         }
34     }
35 }

人类(线程类)

 1 package com.yeepay.sxf.thread1;
 2 /**
 3  * 人类(不同的人代表不同的线程,访问公共资源门)
 4  * @author sxf
 5  *
 6  */
 7 public class UserThread implements Runnable {
 8     //门
 9     private final Gate gate;
10     //当前的人名
11     private final String myName;
12     //当前的人的地址
13     private final String myAddress;
14     //线程的构造器
15     public  UserThread(Gate gate,String myName,String myAddress) {
16         this.gate=gate;
17         this.myName=myName;
18         this.myAddress=myAddress;
19     }
20
21     //线程体
22     @Override
23     public void run() {
24         System.out.println("UserThread.run()  begin:"+myName);
25         while (true) {
26             gate.passGate(myName, myAddress);
27         }
28
29     }
30
31
32 }

测试类(主线程)

 1 package com.yeepay.sxf.thread1;
 2 /**
 3  * 测试类
 4  * @author sxf
 5  *
 6  */
 7 public class Test {
 8     public static void main(String[] args) {
 9         //先声明一个门
10         Gate gate=new Gate();
11
12         //声明三个线程
13         Thread  user1Thread=new Thread(new UserThread(gate, "Asxf", "Ahenan"));
14         Thread  user2Thread=new Thread(new UserThread(gate,"Bsxs","Bhenan"));
15         Thread  user3Thread=new Thread(new UserThread(gate,"Csxy","Chenan"));
16
17         //启动三个线程
18         user1Thread.start();
19         user2Thread.start();
20         user3Thread.start();
21     }
22 }

时间: 2024-08-19 05:14:56

多线程程序设计学习(2)之single threaded execution pattern的相关文章

Single Threaded Execution Pattern

如果不使用Single Threaded Exception Pattern: 门类: 人类: main: 执行结果: 为什么会有broken(损坏): Gate是非线程安全的类. 测试并无法证明安全性,当测试次数不够.时间点不对就可能检查不到问题: 调试的消息也不可靠:   由多个人仔细阅读程序源代码,检查是否会产生问题,才是确保程序安全性最有效的方法. 修改后: 使用SingleThreadedExecutionPattern 保护范围: 只需要改非线程安全类Gate就行了: 为什么不? 因

JAVA多线程(三)模式-Single Threaded Execution

Single Threaded Executio 同时只允许一个线程使用资源. 多线程共享一个资源,仅允许获得了资源锁的线程对资源的访问,避免多线程访问资源造成冲突. 适用环境 多线程争用资源,资源状态(这里的状态指资源对象的属性)可被占用线程变更,需要确保各个线程所见资源状态正确的场景. 样例 抢椅子:幼儿园老师组织3个小朋友抢椅子,规则是一次只能有一个人占据椅子,椅子被占后,老师公布结果,当前占有的小朋友离开,重新开始抢占. 独占资源:椅子,老师. 线程:3个小朋友. 老师类 package

多线程程序设计学习(7)read-write lock pattern

Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线程 二Read-Write Lock Pattern模式什么时候使用---> * 为了多线线程环境下保护数据安全,我们必须避免的冲突 * 一个线程读取,另一个线程写入的read-write conflick * 一个线程写入,另一个线程写入的write-write conflick * 一个线程读取,另

多线程程序设计学习(13)Active Object pattern

Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)--->主动对象接口(工人和工头)--->生产端线程(加工产品的线程)--->存放生产请求的队列(存放请求的队列)--->请求实例化(将方法的启动和执行分离的实例化包含)--->订单--->产品--->订单产品的共同接口 二:Active Object模式什么时候使用-

多线程程序设计学习(12)Thread-soecific storage pattern

Thread-Specific-Storage[线程保管箱] 一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不同线程记录日志(Log)--->负责将日志写入文件的类(TsLog) 二:Thread-Specific Storage模式什么时候使用--->当每个线程必须有自己的独有信息时,可以将该信息放入线程保管箱ThreadLocal 三:Thread-Specific Storage思考--->放

Single Threaded Execution

Single Threaded Execution 也称为 Critical  Section 临界区:危险区域 或者Critical Region Single Threaded Execution 是把视点放在运行的线程上所取的名称 而Critical Session 或Critical Region 则是把视点放在执行的范围上所取的名称 /** *Gate 类   这个是线程安全的 */ public class Gate{ private int counter=0; private S

java多线程(一)---Single Threaded Execution

单线程程序:处理流程始终一条线的程序.例如:无论是调用方法,还是执行for循环,if条件分支语句.甚至更复杂的处理,都不会对这条长线产生影响.在单线程程序中,“在某一时间点执行的处理”只有一个.“正在执行程序的主体”称为线程. 多线程程序:由多个线程组成的程序.例如:GUI应用程序,耗时的I/O处理,多个客户端. 并行:用于表示多个操作“同时处理”. 并发:用于表示“将一个操作分割成多个部分并且允许无序处理”. 启动线程的方法:(1)利用Thread类的子类的实例启动线程:eg:public c

多线程程序设计学习(1)之多线程程序的评量标准

多线程程序的评量标准--->安全性[不损坏对象]        (1)不损坏对象是一种比喻手法,就是数据的一致性.比如银行的扣款操作,并发扣款,账户不会出现负数的余额.--->生存性[进行必要的处理]        (1)指也许不是现在,但一定会进行的必要处理.好比异常处理机制.在出现多线死锁等情况下的必要处理.--->复用性        (1)指可再利用的类,这不是必要条件,但却是体现程序质量重点条件.封装的意思.        (2)如果A类是一个已经确定可正常使用的软件程序的一部

多线程程序设计学习(3)immutable pattern模式

Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个字段的值都无法更改的类.        1.2:immutable也没有任何用来更改字段值的方法.        1.3:immutable参与者方法不需要设置synchronized 二:immutable pattern模式什么时候使用--->当实例产生后,状态不再变化时        2.1实例状