0
JAVA多线程设计模式<br />by  李学科<br />
热身:非线程安全的原子操作<br />线程1:longNum=123L<br />线程2:longNum=456L<br />结果:<br />longNum=123L<br />longNum=456L<br />longNum=0L<br ...
SingleThreadedExecution<br />角色:<br />资源使用者<br />共享资源:被多个线程访问的对象<br />安全方法<br />非安全方法——使用synchronized加以保护<br />死锁的前提<br />...
SingleThreadedExecution<br />public class Gate {<br />    private String people= "Nobody";<br />    private String address...
Immutable<br />典型代表:String类<br />例子:<br />public final class Person {<br />privatefinal String name; //no setter<br />    ...
Immutable<br />特点:<br />不需要synchronized保护<br />高效 <br />使用场景:<br />实例产生后,状态不再发生变化<br />实例需要共享,且访问频繁<br />设计思想:String和Strin...
GuardedSuspension<br />
GuardedSuspension<br />	public synchronized Request getRequest() {<br />        while (queue.size() <= 0) {	//guard condit...
GuardedSuspension<br />升级版的SingleThreadedExecution<br />有一个保护的对象<br />不满足警戒条件则等待<br />提供可以通过警戒条件的方法<br />
Balking<br />
Balking<br />public class Data {<br />    private boolean changed; <br />    public synchronized void change(String newCon...
Balking<br />使用场景<br />不需要刻意执行(doSave)<br />不想等待警戒条件变化<br />警戒条件只有第一次成立,如下<br />private boolean done;<br />public synchron...
在Balking与GuardedSuspension之间					——timeout<br />wait何时结束<br />当notify方法执行时<br />当notifyAll方法执行时<br />当interrupt方法执行时<br />...
ProducerConsumer<br />
ProducerConsumer<br />
ProducerConsumer<br />public class Table {<br />    private final String[] buffer;<br />    private int count; // buffer内的...
ProducerConsumer<br />设计思想<br />线程安全部分的解耦<br />生产者和消费者的快速响应<br />可以给缓冲区数据安排顺序<br />考虑缓冲区的负荷<br />
Thread-Per-Message<br />    private final Helper helper = new Helper();<br />    public void request(final int p1, final c...
Thread-Per-Message<br />特点<br />提升响应性,降低延迟时间<br />对操作顺序无要求<br />不需要返回值<br />
调用与执行分离<br />提高响应性:如果执行时间长,调用的操作受牵连<br />控制顺序:如果不分离,谁先调用先执行,分离后,执行顺序变得可控<br />可取消和可重复执行:在调用和执行的时间差内,可以取消。调用后,产生工作的实例,可以针对一...
Future<br />
Future<br />public Data create(final int param1, final char param1) {<br />	   // (1) 建立FutureData的实体<br />        final F...
Future<br />public class RealData implements Data {<br />    private final String content;<br />    public RealData(int pa...
Future<br />public class FutureData implements Data {<br />    private RealDatarealdata = null;<br />    private booleanre...
Callback与Future<br />
Future<br />特点<br />使用数据和准备数据的分离<br />Thinking<br />数据有多种状态?<br />FutureCreater的安全性<br />Future模式一定会提高效率吗?<br />
つづく    <br />
选修《Matrix》前传+番外篇Animatrix<br />
Animatrix<br />名字由来:通常,Ani是英文单词“动画animation”的缩写,但在这里,它却代表着日文中的“动漫anime”。<br />《黑客帝国动画版》由9段以《黑客帝国》系列电影世界观为基础生发出的短片组成,各篇的角度与...
The Final Flight of the Osiris<br />剧本:沃卓斯基兄弟<br />导演:安迪·琼斯Andy Jones(《最终幻想》) <br />动画设计与制作:SQUARE公司 <br />片长:11:00 <br />
The Final Flight of the Osiris<br />
The Second Renaissance<br />剧本:沃卓斯基兄弟<br />导演:前田真宏 (《青之6号》) <br />动画设计与制作:摄氏4度工作室,东京<br />片长:8:23<br />
The Second Renaissance<br />
The Second Renaissance<br />
Beyond<br />剧本/导演:森本晃司<br />动画设计与制作:摄氏4度工作室,东京 <br />片长:12:48 <br />内容简要:在一栋神秘的大楼里,似乎各种不可思议的事情都可发生,它究竟有什么秘密?这是不是通往真实世界的出口?...
Beyond<br />
Beyond<br />
Java多线程设计模式
Upcoming SlideShare
Loading in...5
×

Java多线程设计模式

1,802

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,802
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
38
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Java多线程设计模式"

  1. 1. JAVA多线程设计模式<br />by 李学科<br />
  2. 2. 热身:非线程安全的原子操作<br />线程1:longNum=123L<br />线程2:longNum=456L<br />结果:<br />longNum=123L<br />longNum=456L<br />longNum=0L<br />longNum=31415926L<br />原因:long和double是64位的,在不同的系统中有可能被拆成两个32位来运算<br />
  3. 3. SingleThreadedExecution<br />角色:<br />资源使用者<br />共享资源:被多个线程访问的对象<br />安全方法<br />非安全方法——使用synchronized加以保护<br />死锁的前提<br />有多个共享资源<br />在一个资源未释放的情况下,去锁定另一个资源<br />获取共享资源的顺序不固定<br />
  4. 4. SingleThreadedExecution<br />public class Gate {<br /> private String people= "Nobody";<br /> private String address = "Nowhere";<br /> public synchronized void pass(String people) {<br /> //只有一个人通过这扇门<br /> }<br /> public String getGateName() {<br /> //<br /> }<br />}<br />
  5. 5. Immutable<br />典型代表:String类<br />例子:<br />public final class Person {<br />privatefinal String name; //no setter<br /> public Person(String name) {<br /> this.name = name;<br /> }<br /> public String getName() {<br /> return name;<br /> }<br />}<br />
  6. 6. Immutable<br />特点:<br />不需要synchronized保护<br />高效 <br />使用场景:<br />实例产生后,状态不再发生变化<br />实例需要共享,且访问频繁<br />设计思想:String和StringBuffer<br />可变和不变解耦<br />二者可互相切换<br />
  7. 7. GuardedSuspension<br />
  8. 8. GuardedSuspension<br /> public synchronized Request getRequest() {<br /> while (queue.size() <= 0) { //guard condition<br /> try { <br /> wait();<br /> } catch (InterruptedException e) { <br /> } <br /> } <br /> return (Request)queue.removeFirst();<br /> }<br /> public synchronized void putRequest(Request request) {<br />queue.addLast(request);<br />notifyAll();<br /> }<br />
  9. 9. GuardedSuspension<br />升级版的SingleThreadedExecution<br />有一个保护的对象<br />不满足警戒条件则等待<br />提供可以通过警戒条件的方法<br />
  10. 10. Balking<br />
  11. 11. Balking<br />public class Data {<br /> private boolean changed; <br /> public synchronized void change(String newContent) { <br /> content = newContent; <br /> changed = true; <br /> } <br /> public synchronized void save() throws IOException { <br /> if (!changed) {// 内容没有变化,返回<br /> return; <br /> } <br />doSave(); //实际资料储存到挡案里用的方法<br /> changed = false; <br /> } <br />}<br />
  12. 12. Balking<br />使用场景<br />不需要刻意执行(doSave)<br />不想等待警戒条件变化<br />警戒条件只有第一次成立,如下<br />private boolean done;<br />public synchronized void init(){<br />if (done) {<br /> return;<br />}<br />doInit();<br /> done=true;<br />}<br />
  13. 13. 在Balking与GuardedSuspension之间 ——timeout<br />wait何时结束<br />当notify方法执行时<br />当notifyAll方法执行时<br />当interrupt方法执行时<br />当timeout时<br />synchronized没有timeout,也不能中断(死锁)<br />
  14. 14. ProducerConsumer<br />
  15. 15. ProducerConsumer<br />
  16. 16. ProducerConsumer<br />public class Table {<br /> private final String[] buffer;<br /> private int count; // buffer内的蛋糕数<br />public synchronized void put(String cake) throws InterruptedException {<br />while (count >= buffer.length) { wait(); }<br /> //加一块蛋糕<br />notifyAll();<br /> }<br /> public synchronized String take() throws InterruptedException {<br />while (count <= 0) {wait(); }<br />notifyAll();<br /> return cake; //减一块蛋糕<br /> }<br />}<br />
  17. 17. ProducerConsumer<br />设计思想<br />线程安全部分的解耦<br />生产者和消费者的快速响应<br />可以给缓冲区数据安排顺序<br />考虑缓冲区的负荷<br />
  18. 18. Thread-Per-Message<br /> private final Helper helper = new Helper();<br /> public void request(final int p1, final char p2) {<br /> new Thread() {<br /> public void run() {<br />helper.handle(p1, p2);<br /> }<br /> }.start();<br /> }<br />
  19. 19. Thread-Per-Message<br />特点<br />提升响应性,降低延迟时间<br />对操作顺序无要求<br />不需要返回值<br />
  20. 20. 调用与执行分离<br />提高响应性:如果执行时间长,调用的操作受牵连<br />控制顺序:如果不分离,谁先调用先执行,分离后,执行顺序变得可控<br />可取消和可重复执行:在调用和执行的时间差内,可以取消。调用后,产生工作的实例,可以针对一份工作,多次执行<br />可分布式处理<br />
  21. 21. Future<br />
  22. 22. Future<br />public Data create(final int param1, final char param1) {<br /> // (1) 建立FutureData的实体<br /> final FutureData future = new FutureData();<br /> // (2) 为了建立RealData的实体,启动新的线程<br /> new Thread() { <br /> public void run() { <br />RealDatarealdata = new RealData(param1, param2);<br />future.setRealData(realdata);<br /> } <br /> }.start(); <br /> // (3)返回FutureData实体<br /> return future;<br /> }<br />
  23. 23. Future<br />public class RealData implements Data {<br /> private final String content;<br /> public RealData(int param1, char param2) {<br />//do something, burn time<br />this.content = new String(buffer);<br /> }<br /> public String getContent() {<br /> return content;<br /> }<br />}<br />
  24. 24. Future<br />public class FutureData implements Data {<br /> private RealDatarealdata = null;<br /> private booleanready = false;<br /> public synchronized void setRealData(RealDatarealdata) {<br /> if (ready) return; // balking<br />this.realdata = realdata;<br />this.ready= true;<br />notifyAll();<br /> }<br /> public synchronized String getContent() {<br /> while (!ready) { //garded<br /> try { wait(); } catch (InterruptedException e) { }<br /> }<br /> return realdata.getContent();<br /> }<br />}<br />
  25. 25. Callback与Future<br />
  26. 26. Future<br />特点<br />使用数据和准备数据的分离<br />Thinking<br />数据有多种状态?<br />FutureCreater的安全性<br />Future模式一定会提高效率吗?<br />
  27. 27. つづく <br />
  28. 28. 选修《Matrix》前传+番外篇Animatrix<br />
  29. 29. Animatrix<br />名字由来:通常,Ani是英文单词“动画animation”的缩写,但在这里,它却代表着日文中的“动漫anime”。<br />《黑客帝国动画版》由9段以《黑客帝国》系列电影世界观为基础生发出的短片组成,各篇的角度与风格各异,制作班底汇聚了日本、美国、韩国三地的动画精英。<br />
  30. 30. The Final Flight of the Osiris<br />剧本:沃卓斯基兄弟<br />导演:安迪·琼斯Andy Jones(《最终幻想》) <br />动画设计与制作:SQUARE公司 <br />片长:11:00 <br />
  31. 31. The Final Flight of the Osiris<br />
  32. 32. The Second Renaissance<br />剧本:沃卓斯基兄弟<br />导演:前田真宏 (《青之6号》) <br />动画设计与制作:摄氏4度工作室,东京<br />片长:8:23<br />
  33. 33. The Second Renaissance<br />
  34. 34. The Second Renaissance<br />
  35. 35. Beyond<br />剧本/导演:森本晃司<br />动画设计与制作:摄氏4度工作室,东京 <br />片长:12:48 <br />内容简要:在一栋神秘的大楼里,似乎各种不可思议的事情都可发生,它究竟有什么秘密?这是不是通往真实世界的出口?MATRIX密探们当然不会就此忽视,他们要极力修补这个漏洞……<br />
  36. 36. Beyond<br />
  37. 37. Beyond<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×