- 浏览: 128128 次
- 性别:
- 来自: 北京
最新评论
-
C_J:
有必要这么鸡冻咩?
编写自己的ClassLoader知识点 -
jason61719:
你这不是说了等于没说吗……就解析个loadClass(),谁不 ...
编写自己的ClassLoader知识点 -
jiming:
tedeyang 写道很好的改进,不过话说回来,mybatis ...
开源,从关注产品社区做起(ibatis3.x的最近一个issue展示) -
C_J:
独爱Java 写道好像实际用处并不是很大,只是多了解了有这个东 ...
Java内存模型笔记 -
独爱Java:
好像实际用处并不是很大,只是多了解了有这个东西而已。。。
Java内存模型笔记
多线程设计模式有很多模式,我用简约的几行伪代码表示吧,如下:
模式1:简单的synchronized+wait/notify
最简单的wait/notify的应用,get的时候,如果没有数据就锁住对象,使当前线程等待,当有数据put的时候,调用notify来唤醒等待的线程,释放对象。如下:
private queue; public synchronized Object get(){ while(queue.size<=0){wait()} return queue.remove(); } public synchronized void put(Object obj){ queue.put(obj); notifyAll(); }
模式2:synchronized+return
模式2不同于模式1,是get的时候直接返回,线程不等待。如下:
private queue; public synchronized Object get(){ return queue.size<=0? null :queue.remove(); } public synchronized void put(Object obj){ queue.put(obj); }
模式3:synchronized+wait/notify+buffer
模式3是对模式1的优化,增加了一个“缓存”,当put的时候超过大小需要wait,防止无限制的put操作而导致溢出。
private queue; private count=0; private bufferSize=10; public synchronized Object get(){ while(count<=0)wait(); count--; return queue.remove(); } public synchronized void put(Object obj){ while(count>=bufferSize) wait(); count++; queue.put(obj); notifyAll(); }
模式4:读写锁
模式5:new工作线程
模式5是在前几个模式的基础上新增加了工作任务线程,当有新请求过来的时候就新建工作线程,如下handle方法:
private queue; private count=0; private bufferSize=10; private synchronized Object get(){ while(count<=0)wait(); count--; return queue.remove(); } public synchronized void put(Object obj){ while(count>=bufferSize) wait(); count++; queue.put(obj); notifyAll(); } public void handle(){ new Thread(this.get()){ public void run(){ System.out.println("Do work..");}}.start(); }
模式6:用线程池来优化工作线程
模式5的坏处是每次一个新的工作,需要new一个新的线程来做,这样开销太大,于是引入的“线程池”,如下:
private queue; private count=0; private bufferSize=10; private final max_wk=20; private final WorkerThread[] pool=new WorkerThread[max_wk]; private synchronized Object get(){ while(count<=0)wait(); count--; return queue.remove(); } public synchronized void put(Object obj){ while(count>=bufferSize) wait(); count++; queue.put(obj); notifyAll(); } public void startWrok(){ for(int i=0;i<pool.size;++i){ pool[i]=new WorkerThread(this); pool[i].start(); } } class WorkerThread extends Thread{ private Channel channel; WorkerThread (Channel channel) { this.channel=channel; } public void run() { while(true){ Object obj=channel.get(); obj.doWork(); } } }
模式7:终止线程
工作线程在做工作的时候先判断是否需要终止线程。
public void stopWork(){ stopWork=true; interrupt(); } public void run(){ try{ while(!stopWork){ do something... } }catch( InterruptedException e){ } }
模式8:ThreadLocal模式
目前很多frame比较经典的保持线程安全的模式,他像一个保险箱一样保管着所有线程对象,他需要做点额外的工作,比如把线程对象set()和get()。
class RealWork { public void doSomething(){// 工作 ... } } class Work { private static final ThreadLocal local=new ThreadLocal(); public void doSomething(){ getReal().doSomething(); } private void getReal(){ // 获取所处当前线程的资源 RealWork obj=local.get(); if(obj==null){ obj=new RealWork(Thread.currentThread().getName()); local.set(obj); } return obj; } }
附录:
transient Thread owner; public boolean put(E o) { if (o == null) throw new NullPointerException(); final AtomicInteger count = this.count;// 大小计数器 if (count.get() == capacity) return false; int c = -1; if (compareAndSetState(0, 1))// 检测当前状态,如果没有线程写,那么保存当前线程 owner = Thread.currentThread(); else acquire(1);// 否则,等待正在写入的线程 try { if (count.get() < capacity) { insert(o); c = count.getAndIncrement(); if (c + 1 < capacity) notFull.signal(); // } } finally { if (tryRelease(1)) { Node h = head; // 等待线程链表 if (h != null && h.waitStatus != 0) unparkSuccessor(h); } } if (c == 0) signalNotEmpty(); return c >= 0; // 精炼的写法 }
在 5.0 以前,锁定的功能是由 Synchronized 关键字来实现的,这样做存在几个问题:
- 每次只能对一个对象进行锁定。若需要锁定多个对象,编程就比较麻烦,一不小心就会出现死锁现象。
- 如果线程因拿不到锁定而进入等待状况,是没有办法将其打断的
ReentrantLock锁等待线程队列:
获得当前等待取锁线程:
public final Collection<Thread> getQueuedThreads() { ArrayList<Thread> list = new ArrayList<Thread>(); for (Node p = tail; p != null; p = p.prev) { Thread t = p.thread; if (t != null) list.add(t); } return list; }
附录:
关于Daemon线程:
我是在偶然之间用到的Daemon线程,当时却没有发现什么特别之处,直到今天才意识到微妙且严重的差别,如下:
Any Java thread can be a daemon thread. Daemon threads are service providers for other threads running in the same process as the daemon thread. The run() method for a daemon thread is typically an infinite loop that waits for a service request.
When the only remaining threads in a process are daemon threads, the interpreter exits. This makes sense because when only daemon threads remain, there is no other thread for which a daemon thread can provide a service.
做过实验才明白,原来当只存在Daemon线程且没有用户线程的时候,JVM退出,以前写thread的时候还真没注意,实验如下:
public class DaemonThread extends Thread{ public void run(){ while(true){ System.out.println("I'm daemon"); } } public static void main(String args[]){ DaemonThread daemon=new DaemonThread(); daemon.setDaemon(true); daemon.start(); } }
可以看到JVM很快就退出了,虽然这里是一个while(true)循环。
发表评论
-
iOS入门(ongoing)
2012-09-13 11:32 1304Record it: The overview of ... -
Stuff about Android
2011-07-09 16:15 1068Foreword: long time ... -
JQuery初体验(Demo)
2011-05-22 13:43 1460Demo:Show <meta content ... -
Java内存模型笔记
2011-04-13 15:48 1540题记: 看到C/C++ ... -
Radiant_The Popular Ruby's CMS Demo篇
2011-04-02 14:49 1245题记: 上篇 记录我第一次安装Rodiant经过和 ... -
Radiant_The Popular Ruby’s CMS安装篇
2011-03-28 00:48 1284题记: 今天第一次参加JE的线下活动,robbin等 ... -
关于Azul 并发垃圾回收器
2011-03-26 14:40 1322题记: 总感觉JE讨论的帖子的东西都比较滞后,所以会 ... -
phpCMS & jQuery是我该做的(阉割了)
2011-02-27 23:02 81WD讲究以plugin挂载为结构,我需要构造一个p ... -
我的玩意:J2ME的Criteria初探
2011-01-20 21:59 1021题记: 前几天跟初中同学聊天,他问我能不能做一个GP ... -
编写自己的ClassLoader知识点
2011-01-13 14:41 1874题记: 看到InfoQ关于ClassLoader的文 ... -
周末好玩,用短信控制你的计算机
2011-01-10 16:34 2995Snapshot: 详情 ... -
About Dock Plugin on Mac
2010-11-21 22:47 1467题记: 第一次接触MAC的开发..... ... -
可变hashcode的隐患和序列化安全
2010-10-25 00:55 1375可变hashcode的隐患 为识别对象,JDK ... -
体验OSGi(helloworld.jar)—富app的热拔插
2010-10-18 23:22 2443记得以前工作的时候,有天direct manager问 ... -
MongoDB on DAO with Java Language
2010-08-26 19:17 1434A Quick Tour Using the Java d ... -
Getting Start on Mongodb
2010-08-26 01:29 1514题记: 最近老和同学聊到non-relational ... -
Java Media Framework本地玩转摄像头
2010-08-04 00:57 17441、简介The JavaTM Media Framework ... -
从WeakLogHandler应用看Java的引用、引用队列
2010-06-14 00:58 1503题记: 前几天讨论到WeakHashMap(这个是个弱引用的 ... -
《重构》读书笔记
2010-05-09 00:05 1051Martin Fowler于2003年出版 ... -
RPC之WebServices&RMI&JMS,phprpc框架?(待续)
2010-05-06 22:31 55前段时间写过基本的WebServices,也没再做深入 ...
相关推荐
Java多线程设计模式是Java开发中的重要领域,它涉及到如何在并发环境下高效、安全地管理资源和控制程序执行流程。本资料集包含了清晰完整的PDF版书籍和源代码,为学习和理解Java多线程设计模式提供了丰富的素材。 ...
Java多线程设计模式是Java编程中至关重要的一个领域,它涉及到如何在并发环境中高效、稳定地执行多个任务。在Java中,多线程可以提高应用程序的响应速度和整体性能,尤其是在处理I/O密集型或计算密集型任务时。本...
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
Java多线程设计模式是构建高并发、高性能应用的关键技术之一。这些模式通过优化资源利用、提高程序可读性和可维护性,使并发编程更加高效和安全。以下将详细讲解标题和描述中涉及的一些核心知识点: 1. **线程池...
《Java多线程设计模式详解》是一本深入探讨Java并发编程和设计模式的专业书籍,它涵盖了多线程环境下的各种核心概念、最佳实践以及常见问题的解决方案。这本书旨在帮助开发者在实际开发过程中更好地理解和应用多线程...
标题和描述均指向了一个关于Java多线程设计模式的PDF文档的下载链接,这暗示了文档的主要内容将围绕Java中的多线程编程及其设计模式展开。在Java领域,多线程是一个核心概念,它允许程序执行多个任务同时进行,极大...
标题“java多线程设计模式详解.pdf”中提到的知识点是关于Java多线程编程中设计模式的应用。Java多线程是并发编程的重要组成部分,设计模式则是软件工程中用于解决特定问题的最佳实践。将两者结合起来,意味着此文件...
java多线程设计模式.pdf java多线程设计模式.pd
Java多线程设计模式是Java开发中的重要领域,它涉及到如何高效、安全地利用系统资源进行并发处理。在这个主题中,我们将深入探讨单线程、生产者与消费者模型以及Java中实现多线程的各种方法。 首先,单线程是程序...
java多线程设计模式,作者是:结城 浩,由 博硕文化 译。2005年4月,由中国铁道出版社出版。内附带部分源代码。
JAVA多线程设计模式_中国铁道出版社 本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计...
Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到...
《JAVA多线程设计模式》中包含JAVA线程的介绍导读,12个重要的线程设计模式和全书总结以及丰富的附录内容。每一章相关线程设计模式的介绍,都举一反三使读者学习更有效率。最后附上练习问题,让读者可以温故而知新,...
### Java多线程设计模式详解 #### 一、Java多线程基础 Java语言自诞生以来,便内置了对多线程的支持。多线程可以让应用程序在同一时间处理多个任务,提高程序的执行效率和响应速度。Java中创建线程有两种基本方式...
Java多线程设计模式是Java开发中的重要领域,它涉及到并发编程、系统性能优化以及程序的稳定性。在Java中,多线程允许程序同时执行多个任务,极大地提升了程序的执行效率。本资源提供了详细的Java多线程设计模式的...