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

  • Single Threaded Executio

    • 同时只允许一个线程使用资源。
    • 多线程共享一个资源,仅允许获得了资源锁的线程对资源的访问,避免多线程访问资源造成冲突。
    • 适用环境

      • 多线程争用资源,资源状态(这里的状态指资源对象的属性)可被占用线程变更,需要确保各个线程所见资源状态正确的场景。
    • 样例

      • 抢椅子:幼儿园老师组织3个小朋友抢椅子,规则是一次只能有一个人占据椅子,椅子被占后,老师公布结果,当前占有的小朋友离开,重新开始抢占。
      • 独占资源:椅子,老师。
      • 线程:3个小朋友。
    • 老师类

    • 					package SingleThreadedExecution;
      
      					public class Teacher {
      						public void chairHolded(String owner){
      							if(owner!=null){
      								System.out.println(owner+"抢到了椅子!");
      							}
      						}
      						public static void main(String[] args) {
      							Teacher t=new Teacher();
      							IChair chair=new Chair(t);//单线程运行模式,抢椅子。
      							Child c1=new Child(chair,"c1");
      							Child c2=new Child(chair,"c2");
      							Child c3=new Child(chair,"c3");
      							Thread t1=new Thread(c1);
      							Thread t2=new Thread(c2);
      							Thread t3=new Thread(c3);
      							t1.start();
      							t2.start();
      							t3.start();
      						}
      
      					}
    • 小朋友类

    • 				package SingleThreadedExecution;
      
      				public class Child implements Runnable {
      					private IChair chair=null;
      					private String myName=null;
      					private int cnt=0;
      					public Child(IChair chair,String myName){
      						this.chair=chair;
      						this.myName=myName;
      					}
      					@Override
      					public void run() {
      						while(true){
      							boolean isSuccess=chair.setOwner(this.myName);
      							if(isSuccess){
      								cnt++;
      							}
      							try {
      								Thread.sleep(1);
      							} catch (InterruptedException e) {
      								System.out.println("Interrupted!");
      							}
      						}
      					}
      
      				}
    • 椅子接口

    • 				package SingleThreadedExecution;
      
      				public interface IChair {
      					public boolean setOwner(String newOne);
      				}
    • 椅子类

    • 				package SingleThreadedExecution;
      
      				public class Chair implements IChair{
      					private Teacher observer=null;
      					private String owner;
      
      					public Chair(Teacher observer){
      						this.observer=observer;
      					}
      
      					public synchronized boolean setOwner(String newOne){
      						this.owner=newOne;
      						observer.chairHolded(this.owner);
      						return true;
      					}
      				}
时间: 2024-12-28 02:13:33

JAVA多线程(三)模式-Single Threaded Execution的相关文章

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

Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResource(共享资源) 二:single threaded execution pattern模式什么时候使用--->多线程程序设计时--->数据可被多个线程访问的时候--->共享资源状态可能变化的时候--->需要确保数据安全性的时候 三:single threaded execution p

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多线程Future模式

Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分成AB两个过程,并且AB两个过程之间不需要彼此的返回结果 A过程需要1秒钟,B过程需要2秒钟,主线程其他操作2秒钟按照正常编写,程序大概需要执行5秒如果按照Future模式只需要执行2秒(取其中运行时间最久的线程的运行时间) Future模式的核心实现在于两个方面 1.多线程运行 主线程采用多线的方

Java多线程Master-Worker模式

Java多线程Master-Worker模式,多适用于需要大量重复工作的场景中. 例如:使用Master-Worker计算0到100所有数字的立方的和 1.Master接收到100个任务,每个任务需要0到100中每个数字的立方,这里为了效果,每个任务再sleep一秒, Master需要将这些任务放到一个支持高并发的非阻塞队列queue中如:ConcurrentLinkedQueue<E>. 2.Master创建10个worker去执行这100个任务,并准备一个支持高并发且线程安全的hashMa

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

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它

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

停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它线程).尚有未处理完的任务等.本文介绍的Two-phase Termination模式提供了一种通用的用于优雅地停止线程的方法. Two-phase Termination模式简介 Java并没有提供直接的API用于停止线程.Two-phase Termination模式通过将停止线程这个动作分解为准备阶

Java多线程(三)

本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 Account account = new Account("123456", 1000); 5 DrawMoneyRunnable drawMoneyRunnable = new DrawMoneyRunnable(account,

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

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-object.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安

java多线程三之线程协作与通信实例

多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition.     附加 : 用监视器进行线程间通信 2.生产者消费者实现,使用LinkedList自写缓冲区. 3.多线程之阻塞队列学习,用阻塞队列快速实现生产者消费者模型.    附加:用布尔变量关闭线程        在三种线程同步方法中,我们这里的实例用Lock锁来实现变量同步,因为它比较灵活直观.