图解java多线程设计模式-第一章 Single Threaded Execution模式

本文深入探讨Java多线程设计中的SingleThreadedExecution模式,解析死锁发生条件及预防策略,详解synchronized关键字作用及原子操作概念,同时介绍Semaphore类在并发控制中的应用。

以下内容是我在阅读《图解Java多线程设计模式》一书中的总结和思考

本章配语是:能通过这座桥的只有一个人

几个概念:

  1. SharedResource(共享资源):可以被多个线程访问的类,包含safeMethod和unsafeMethod。其中unsafeMethod就是在多线程环境下不安全的,需要同步的方法。
  2. Single Threaded Execution模式:同一时间内只能让一个线程执行处理。

在Single Threaded Execution模式中,满足以下全部条件时,死锁就会发生:

  1. 存在多个SharedResource角色
  2. 线程在持有某个SharedResource角色的锁的同时,还要获取其他SharedResource角色的锁才能完成任务
  3. 获取SharedResource角色的锁的顺序是对称相反的,例如先锁A再锁B,和先锁B再锁A,这样就是对称相反

以上条件有一个不满足,死锁就会破解。比如:

  1. 将多个SharedResource角色封装到一个类中,这样就变成只有一个SharedResource角色了
  2. 上锁的顺序全都一样,这样也不会发生死锁

注意,这只是针对Single Threaded Execution模式:同一时间只能让一个线程执行处理。而能够实现这样的关键就是对访问共享资源的方法(method)进行互斥处理,也就是synchronized。

所以,只要同一个类中的方法(method)标志了synchronized关键字,就说明这些方法(method)之间是互斥的。

 

可复用性和继承反常

如果子类能够访问SharedResource角色的字段,那么编写子类的开发人员就要注意,子类中的方法是否可以破坏安全性,因为子类对象可以随意访问SharedResource的字段。

对于多线程程序设计来说,继承会引起一些麻烦的问题,需要妥善处理。

 

临界区的大小和性能

临界区:上锁的区域,就是{}花括号之间的代码。

一般来说,临界区越大,性能就越低,发生线程冲突的概率就越高。

void method()
{
	synchronized (this)
	{
		// 线程无关的代码
		...
		// 真正需要同步的代码
	}
}

就以上代码,如果将线程无关的代码放到同步代码块中,那么明明不用等待就可以操作的代码却要花时间去等待,那么就会降低效率了。

 

synchronized在保护着什么

这个问题要考虑到两个方面,一个是要弄清保护什么,另一个是要确定保护成功。

保护的一般就是SharedResource,具体一点来说就是字段的值。

是否保护成功:

关于这个问题,是需要不断累积经验才能快速准确地判断的。比如说出现继承反常的情况(即父类字段可以被子类直接调用)。

又比如对于SharedResource,一般来说是要一起放到临界区之内的,如果出现类似如下代码,即SharedResource没有放在一起保护,这样也就没有意义了,达不到效果。

public synchronized void setName(String name)
{
	this.name = name;
}

public synchronized void setAddress(String address)
{
	this.address = address;
}

 

原子操作

是否是原子操作对于是否需要上锁有比较大的影响。如果一个方法里面只有一个原子操作,那么就没有必要上锁了。

一般来说:基本数据类型和引用操作都是原子操作,但:double和long的操作就不是原子操作。还有,++和--也不是原子操作。

 

Semaphore类

java.util.concurrent包提供了表示计数信号量的Semaphore类。

这个有空再贴代码上来吧

本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA设计模式的一本好书。(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中在代码的重要部分加上标注使读者更加容易解读,再配合众多的说明图解,无论对于初学者还是程序设计高手来说,这都是一本学习和认识设计模式非常难得的好书。 书中包含Java线程的介绍导读、12个重要的线程设计模式和全书总结以及丰富的附录内容。第一章相关线程设计模式的介绍,都举一反三使读者学习更有效。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的精华,书中最后附上练习问题解答,方便读者学习验证。 目录 漫谈UML UML 类图 类和层次结构的关系 接口与实现 聚合 访问控制 类间的关联性 顺序图 处理流程和对象间的协调 时序图 Introduction 1 Java语言的线程 Java语言的线程 何谓线程 明为追踪处理流程,实则追踪线程线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 线程的协调 wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他话题 重点回顾 练习问题 Introduction 2 多线程程序的评量标准 多线程程序的评量标准 安全性——不损坏对象 生存性——进行必要的处理 复用性——可再利用类 性能——能快速、大量进行处理 评量标准的总结 重点回顾 练习问题 第1章 Single Threaded Execution——能通过这座桥的,只有一个人 第2章 Immutable——想破坏它也没办法 第3章 Guarded Suspension——要等到我准备好喔 第4章 Balking——不需要的话,就算了吧 第5章 Producer-Consumer——我来做,你来用 第6章 Read-Write Lock——大家想看就看吧,不过看的时候不能写喔 第7章 read-Per-Message——这个工作交给你了 第8章 Worker Thread——等到工作来,来了就工作 第9章 Future——先给您这张提货单 第10章 Two-Phase Termination——快把玩具收拾好,去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值