多线程
iteye_19520
这个作者很懒,什么都没留下…
展开
-
DCL失效
Double-Checked Locking看起来是非常完美的。但是很遗憾,根据Java的语言规范,上面的代码是不可靠的。出现上述问题, 最重要的2个原因如下:1, 编译器优化了程序指令, 以加快cpu处理速度.2, 多核cpu动态调整指令顺序, 以加快并行运算能力.问题出现的顺序:1, 线程A, 发现对象未实例化, 准备开始实例化2, 由于编译器优化了程序指令, 允许对...2008-05-21 13:31:20 · 178 阅读 · 0 评论 -
不可变性
3.4 不可变性为了满足同步的需要,另一种方法是使用不可变对象[EJItem13]。到目前为止,几乎所有我们已经描述过的原子性与可见性的危险,比如访问过期数据,未及时更新或者观察一个处于不一致状态的对象,它们都产生于多线程下各种难以预测的行为协同工作,多个线程总试图同时访问相同的可变状态。如果对象的状态不能被修改,这些风险与复杂度就自然而然地消失了。创建后状态不能被修改的对象叫做不可变对...2008-05-28 09:29:19 · 153 阅读 · 0 评论 -
JAVA中断线程的方法
Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的! 现在,如果你要安全有效地终止一个线程,应该采用以下这些方法: 1,线程正常执行完毕,正常结束。也就是让run方法执行完毕,该线程就会正常结束。 2,监视某些条件,结束线程...2008-06-30 11:26:50 · 94 阅读 · 0 评论 -
中断JAVA线程
在JAVA中,通过其对线程类的内嵌支持,编程人员编写多线程程序是很简易的。然而,在编程人员面前,多线程呈现出一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的、难以发现的错误。在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程。 背景 中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还...2008-06-30 22:44:58 · 63 阅读 · 0 评论 -
JDK5新特性--java.util.concurrent CountDownLatch(5)
从名字可以看出,CountDownLatch是一个倒数计数的锁,当倒数到0时触发事件,也就是开锁,其他人就可以进入了。在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。一...2008-07-02 09:34:04 · 151 阅读 · 0 评论 -
JDK5新特性--java.util.concurrent BlockingQueue(4)
并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中,另外四个写线程用于取出文件对象,为了模拟写操作耗时长的特点,特...2008-07-02 10:57:26 · 76 阅读 · 0 评论 -
Java线程join()方法的用处
run()和start() 是大家都很熟悉的两个方法。把希望并行处理的代码都放在run() 中;stat()用于自动调用run(),这是JAVA的内在机制规定的。并且run()的访问控制符必须是public,返回值必须是void(这种说法不准确,run() 没有返回值),run()不带参数。闲话少说,我们要讲的是join(),我们首先来看个例子:代码: /**...2008-07-02 14:24:21 · 123 阅读 · 0 评论 -
使用Callable返回结果
本文是Sun官方以Blog形式发布的Java核心技术窍门(JavaCoreTechTip)中的一个。本文主要介绍了Callable及其相关接口和类的使用,篇幅不长且易于理解,故翻译在了此处,相信对于准备或刚接触java.util.concurrent的朋友会有所帮助。 自从Java平台的最开始,Runnable接口就已存在了。它允许你定义一个可由线程完成的任务。如...2008-07-02 14:50:42 · 230 阅读 · 0 评论 -
JDK5新特性--java.util.concurrent Semaphore(8)
操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java并发库的Semaphore可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在...2008-07-03 10:43:23 · 137 阅读 · 0 评论 -
关于用信号量Semaphore完成互斥锁Mutex
本文探讨用信号量Semaphore实现互斥锁Mutex的问题 在Doug lea的那本著名的《Java并发编程—设计原则与模式》,英文名"Concurrent Programming in Java™: Design Principles and Patterns, Second Edition",书中提到可以用信号量Semaphore实现互斥锁Mutex。虽然java中是通过sync...2008-07-03 11:26:05 · 175 阅读 · 0 评论 -
java基础--Java 5.0多线程编程(1)
Java自1995年面世以来得到了广泛得一个运用,但是对多线程编程的支持Java很长时间一直停留在初级阶段。在Java 5.0之前Java里的多线程编程主要是通过Thread类,Runnable接口,Object对象中的wait()、 notify()、 notifyAll()等方法和synchronized关键词来...2008-07-03 14:13:15 · 96 阅读 · 0 评论 -
java基础--Java 5.0多线程编程(2)
*1: 定义了几个任务*2: 初始了任务执行工具。任务的执行框架将会在后面解释。*3: 执行任务,任务启动时返回了一个Future对象,如果想得到任务执行的结果或者是异常可对这个Future对象进行操作。Future所含的值必须跟Callable所含的值对映,比如说例子中Future对印Callable*4: 任务1正常执行完毕,future1...2008-07-03 14:30:33 · 113 阅读 · 0 评论 -
java基础--Java 5.0多线程编程(3)
Lock接口ReentrantLock是Lock的具体类,Lock提供了以下一些方法:lock(): 请求锁定,如果锁已被别的线程锁定,调用此方法的线程被阻断进入等待状态。 tryLock():如果锁没被别的线程锁定,进入锁定状态,并返回true。若锁已被锁定,返回false,不进入等待状态。此方法还可带时间参数,如果锁在方法执行时已被锁定,线程将继...2008-07-03 14:35:54 · 91 阅读 · 0 评论 -
JDK5新特性--java.util.concurrent CyclicBarrier(3)
在实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。这时候CyclicBarr...2008-07-03 15:13:33 · 117 阅读 · 0 评论 -
使用不常进行修改的可变集合来减少应用程序的同步开销
使用多个 Java 线程之间共享数据的缺点在于数据访问必须同步,从而避免出现不一致的内容视图,后者可能会导致应用程序失败。例如,Hashtable 类的 put() 和 get() 方法是同步的。因为需要实现同步,所以 put() 和 get() 方法在执行时将同时单独地访问数据;否则,应用程序数据结构可能会被破坏。当某个应用程序的线程频繁访问这些方法,导致线程出现阻塞时,这些方法的同...2008-05-28 00:12:42 · 66 阅读 · 0 评论 -
正确理解java构造函数内非final函数
大家都知道java构造 的使用方法吧,可能大家都用它来进行对象的初始化。就像下面这样一个例子。 public class Test...{ public static void main(String [] args) ...{ Entry e = new Entry(); Syst...2008-05-27 21:49:36 · 381 阅读 · 0 评论 -
阻塞I/O,非阻塞I/O
拿socket举例。当read数据时,如果这时没有数据可读,阻塞I/O会一直等待有数据读,数据从kernel copy到socket的buffer后返回;非阻塞I/O会立即返回,但如果有数据可读,非阻塞I/O也是等数据从kernel copy到socket的buffer后返回。以上是阻塞与非阻塞I/O的区别,但以上两个例子的read操作都是同步的,是不是很奇怪?点解称其为同步?看看...2008-05-22 10:58:13 · 107 阅读 · 0 评论 -
Synchronize与JAVA内存模型
每个JAVA对象都有一把所,当有多个线程同时访问共享资源的时候,需要Synchronize 来控制安全性,synchronize分synchronize 方法和synchronize块,使用synchronize块时, 一定要显示的获得该对象的锁(如synchronize(object))而方法则不需要。 JAVA 的内存模型是对每一个进程有一个主内存,每个线程有自己的内存,他们...2008-05-22 23:00:29 · 136 阅读 · 0 评论 -
进程和线程
进程通常是一个程序的实例。但进程是不活动的,必须有一个线程,线程负责执行地址空间中的进程代码。一个进程可以同时运行多个线程,每个线程拥有自己的堆栈、CPU寄存器和CPU时间。多个线程共享进程占有的资源,比如地址空间、动态内存、文件等。 Java虚拟机中线程可以粗略的如下表示: 可以看到,每个线程有自己的本地变量,同时也共享在Java虚拟机中的全局存...2008-05-22 23:21:44 · 49 阅读 · 0 评论 -
java中堆和堆栈的区别
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾...2008-05-22 23:40:14 · 62 阅读 · 0 评论 -
JVM内存分区
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放数据栈区:1.每个线程包含一个栈区,栈中只保存原始类型数据和对象和对象引用(不是对象),对象都存放在堆...2008-05-23 01:39:36 · 129 阅读 · 0 评论 -
Java多核线程笔记-volatile的原理与技巧
Java多核线程笔记-volatile的原理与技巧volatile, 用更低的代价替代同步为什么使用volatile比同步代价更低?同步的代价, 主要由其覆盖范围决定, 如果可以降低同步的覆盖范围, 则可以大幅提升程序性能. 而volatile的覆盖范围仅仅变量级别的. 因此它的同步代价很低.volatile原理是什么?volatile的语义, 其...2008-05-23 11:13:35 · 68 阅读 · 0 评论 -
线程封闭
线程封闭新一篇: 线程安全<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open...2008-05-26 15:28:47 · 73 阅读 · 0 评论 -
Java中ThreadLocal的设计与使用
早在Java1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择。使用这个工具类可以很简洁地编写出优美的多线程程序,虽然ThreadLocal非常有用,但是似乎现在了解它、使用它的朋友还不多。 ThreadLocal是什么 ThreadLocal是什么呢?其实ThreadLoca...2008-05-26 16:03:00 · 60 阅读 · 0 评论 -
ThreadLocal的几种误区
ThreadLocal的几种误区 最近由于需要用到ThreadLocal,在网上搜索了一些相关资料,发现对ThreadLocal经常会有下面几种误解 一、ThreadLocal是java线程的一个实现 ThreadLocal的确是和java线程有关,不过它并不是java线程的一个实现,它只是用来维护本地变量。针对每个线程,提供自己的变量版本,主要是为了避免线程冲突...2008-05-26 16:10:03 · 112 阅读 · 0 评论 -
利于ThreadLocal管理Hibernate Session
在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Session的频繁创建和销毁,对于提高系统的性能来说是非常重要的,以往是通过eclipse的插件来自动完成这些代码的,当然效果是不错的,但是总是觉得不爽(没有读懂那些冗长的代码),所以现在打算自己实现Session管理的代码。我们知道Session是由Session...2008-05-26 16:25:31 · 71 阅读 · 0 评论 -
Java的多线程及安全性
多线程是一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的。任何线程都有四种状态:产生(New),可执行(Runnable),阻塞(Blocked),死亡(Dead)。1.Java的多线程在 Java中实现多线程有两种方法:第一种方法...2008-05-27 21:11:49 · 96 阅读 · 0 评论 -
线程同步原则
同步的基本规则:只要读取可能由其他线程写入的变量,或者写入随后由其他线程读取的变量,就必须进行同步。很容易“忘记”这个规则,特别是在读取时。...2008-05-27 21:14:49 · 97 阅读 · 0 评论 -
Java 理论和实践:变还是不变?
不变对象具备许多能更方便地使用他们的特性,包括不严格的同步需求和不必考虑数据讹误就能自由地共享和高速缓存对象引用。尽管不变性可能未必对于任何类都有意义,但大多数程式中至少有一些类将受益于不可变。在本月的 Java 理论和实践中,Brian Goetz说明了不变性的一些长处和构造不变类的一些准则。请在附带的论坛中和作者和其他读者分享您关于本文的心得。(也能够单击文章顶部或底部的“讨论”来访问论...2008-05-27 21:28:33 · 69 阅读 · 0 评论 -
JDK5新特性--java.util.concurrent ExecutorCompletionSe
考虑以下场景:浏览网页时,浏览器了5个线程下载网页中的图片文件,由于图片大小、网站访问速度等诸多因素的影响,完成图片下载的时间就会有很大的不同。如果先下载完成的图片就会被先显示到界面上,反之,后下载的图片就后显示。Java的并发库的CompletionService可以满足这种场景要求。该接口有两个重要方法:submit()和take()。submit用于提交一个runnable或者c...2008-07-04 10:25:56 · 113 阅读 · 0 评论