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

简介: Single Threaded Execution Pattern【独木桥模式】一:single threaded execution pattern的参与者--->SharedResource(共享资源)二:single threaded execution pattern模式什么时候使用--->多线程程序设计时--->数据可被多个线程访问的时候--->共享资源状态可能变化的时候--->需要确保数据安全性的时候三:single threaded execution pattern思考--->synchronized一见到它,势必保护着什么公共资源的数据。

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 }
View Code

人类(线程类)

 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 }
View Code

测试类(主线程)

 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 }
View Code

 

目录
打赏
0
0
0
0
11
分享
相关文章
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
37 10
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
335 6
Java 程序设计 第八章 线程
Java 程序设计 第八章 线程
|
9月前
|
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
175 0
Python多线程学习优质方法分享
Python多线程学习优质方法分享
33 0
|
9月前
|
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
292 0
|
9月前
|
Java线程学习经典例子-读写者演示
Java线程学习经典例子-读写者演示
30 0
|
23天前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
45 17
|
1月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
54 26
|
3月前
|
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
263 2
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等