Java多线程设计模式
Upcoming SlideShare
Loading in...5
×
 

Java多线程设计模式

on

  • 1,867 views

 

Statistics

Views

Total Views
1,867
Views on SlideShare
1,867
Embed Views
0

Actions

Likes
2
Downloads
33
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Java多线程设计模式 Java多线程设计模式 Presentation Transcript

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