![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java Concurrency
文章平均质量分 53
myhappyjava
这个作者很懒,什么都没留下…
展开
-
Java并发编程实践笔记之—发布和逸出(Publication and Escape)
什么是发布对象——使对象在当前作用域之外的代码中使用什么是逸出——当某个不应该发布的对象被发布时对象如何逸出的最简单的方法是将对象的引用保存到一个公有的静态变量中当发布某个对象时,可能会间接地发布其他对象。如果将一个对象添加到被发布的集合对象中,那么同样会发布这个对象当发布一个对象时,在该对象的非私有域中引用的所有对象同样会被发布;或者说当把一个对象传递给某个外部方法时,就原创 2015-01-28 20:58:42 · 1247 阅读 · 0 评论 -
Java并发编程实践笔记之—线程封闭(Thread Confinement)
什么是线程封闭仅在单线程内访问数据,就不需要同步(可理解成“将对象封闭在线程中”)是实现线程安全性的最简单的方式之一应用1——Swing中大量使用了线程封闭技术。Swing的可视化组件和数据模型对象都不是线程安全的,Swing通过将它们封闭到Swing的事件分发线程中来实现线程安全性。Swing应用程序的许多并发错误就是由于错误地在另一个线程中使用了这些被封闭的对象应用2——JDBC的Co原创 2015-02-10 20:35:09 · 1136 阅读 · 1 评论 -
Java并发编程实践笔记之—可见性(Visibility)
同步的重要性有两个方面:实现原子性:防止某个线程正在使用对象状态而另一个线程同时在修改改状态内存可见性:确保一个线程修改了对象状态后,其他线程能够看到发生的状态变化失效数据缺乏同步的程序可能会产生的一种错误情况就是——失效数据失效数据举例//在没有同步的情况下共享数据public class NoVisibility { private static boolean原创 2015-01-28 21:00:08 · 1499 阅读 · 1 评论 -
Java并发编程实践笔记之—不变性(Immutability)
不可变对象对象在创建后其状态就不能被改变,称为不可变对象对象的状态不会改变,那同步的问题和复杂性也就消失了简单,只有一种状态,是由构造函数来控制的安全,不会被恶意破坏,可安全的共享和发布不可变对象必须满足的条件:对象创建后其状态就不能修改对象的所有域都是final类型的对象是正确创建的(创建期间,this引用没有逸出)事实不可变对象(Effectively Immutabl原创 2015-02-10 20:34:11 · 555 阅读 · 0 评论 -
Java并发编程实践笔记之—线程
线程的优势多处理器以成为趋势,而单线程只利用了一个处理器,所以线程可以发挥多处理器的强大能力;同时在单处理器上可以提高吞吐率,比如一个线程等待I/O完成,另一个线程可继续运行用线程可以简化建模,可以为每种类型的任务分配一个专门的线程,复杂异步的工作流分解成一组简单且同步的工作流,每个工作流在一个线程中运行线程简化了异步事件的处理,比如服务器应用程序(application原创 2015-01-28 21:10:28 · 280 阅读 · 0 评论 -
Java并发编程实践笔记之—并发容器(Concurrent Collections)
什么是并发容器Java5.0提供针对多个线程并发访问设计的改进同步容器的性能(同步容器将所有对容器状态的访问都串行化来实现线程安全,代价就是严重降低并发性)Queue用来保存一组待处理的元素几种实现:ConcurrentLinkedQueue, PriorityQueue, BlockingQueue(可阻塞,用在生产者-消费者模式中)Queue和List的关系:虽然可以用Li原创 2015-02-02 20:40:43 · 763 阅读 · 0 评论 -
Java并发编程实践笔记之——加锁机制(Locking)
多个状态变量的一致性保持当线程安全的不变性条件中涉及多个变量时,并且各个变量之间不是彼此独立,某个变量对其他变量的值产生约束。那当更新一个变量时,要在同一个原子操作中更新其他的变量内置锁(Intrinsic Locks)Java提供了同步代码块(Synchronized Block)这种内置锁机制来支持原子性每个Java对象都可以用作一个实现同步的锁,被称为内置锁或者监视锁内置原创 2015-01-28 21:02:28 · 446 阅读 · 0 评论 -
Java并发编程实践笔记之——用锁来保护状态(Guarding State with Locks)
什么是用锁来保护状态对于可能被多个线程同时访问的可变状态变量,在访问它时(不仅仅是写入的时候)都需要持有同一个锁。这种情况下,我们称状态变量时由这个锁来保护的内置锁许多线程安全类使用的加锁模式是,将可变状态都封装在对象内部,并通过对象的内置锁对所有访问可变状态的代码进行同步每个对象都有一个内置锁,只是为了免去显式地创建锁对象为什么不在每个方法声明中加synchronized原创 2015-02-02 10:24:49 · 443 阅读 · 0 评论 -
Java并发编程实践笔记之——活跃性和性能(Liveness and Performance)
将整个方法加synchronized,每次只能有一个线程执行,在服务器负载过高的情况下用户的请求要排队等待处理(比如要做长时间的计算),给用户带来糟糕的体验。也就是并发性差而且仍会有CPU处于空闲状态缩小同步代码块的范围尽量将不影响共享状态且执行时间较长的操作从同步代码块中分离出去,一定不要持有锁如果使用了同步代码块,就不要再重复使用AtomicLong之类的原子变量,使用两种原创 2015-02-02 10:23:36 · 459 阅读 · 0 评论 -
Java并发编程实践笔记之-什么是线程安全
线程安全的定义核心是正确性定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的线程安全类中封装了必要的同步机制,所以客户端无须进一步采取同步措施无状态(stateless)的对象一定是线程安全的什么是无状态:不包含任何field,也不包含任何对原创 2015-02-02 10:14:31 · 319 阅读 · 0 评论 -
Java并发编程实践笔记之—同步容器类(Synchronized Collections)
什么是同步容器类包括Vector和Hashtable(早期JDK的一部分)由Collections.synchronizedXxx等工厂方法创建的实现方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态(下节将看到并发容器不是这么做的)某些情况下需要额外的客户端加锁来保护符合操作迭代(遍历容器中的元素)(书中的例子5-3,5-4)跳转条件运原创 2015-01-28 20:56:06 · 331 阅读 · 0 评论 -
Java并发编程实践笔记之—阻塞队列和生产者-消费者模式(Blocking Queues and the Producer-consumer Pattern)
BlockingQueue提供了可阻塞的put和take,和支持定时的offer和pollQueue可以是有界的或者无界的支持了生产者-消费者的设计模式,将两个过程解耦如果数据项添加队列失败,offer方法返回失败状态,这样可以创建更多灵活的策略来处理负荷过载的情况多种实现:LinkedBlockingQueue,ArrayBlockingQueue,PriorityBlockingQue原创 2015-02-02 20:38:19 · 492 阅读 · 0 评论 -
Java并发编程实践笔记之—阻塞和中断方法(Blocking and Interruptible Methods)
线程阻塞线程阻塞或者暂停执行的原因等待I/O操作结束等待获得一个锁等待从Thread.sleep中醒来等待另一个线程的计算结果线程阻塞时的状态BLOCKEDWAITINGTIMED_WAITING阻塞操作和执行时间很长的普通操作差别在于:被阻塞的线程必须等待某个不受它控制的事件发生后才能继续执行,线程被置回RUNNALBE状态,并可以再次被调度执行原创 2015-01-28 18:03:03 · 479 阅读 · 0 评论 -
Java并发编程实践笔记之—安全发布(Safe Publication)
安全地共享对象前面几节讲的都是如何确保对象不被发布。但是在某些情况下我们希望在多个线程间共享对象,此时必须确保安全地进行共享可变对象必须通过安全的方式来发布要安全地发布一个对象,对象的引用以及对象的状态必须同时对其他线程可见,一个正确构造的对象可以通过以下几种的方式来安全发布这个例子是一个不安全的发布,由于存在可见性问题,其他线程看到Holder对象处于不一致的状态// 不安全的发布原创 2015-01-28 20:57:11 · 1070 阅读 · 0 评论 -
Java并发编程实践笔记之——原子性(Atomicity)
竞态条件(Race Condition)++count这个操作是紧凑的语法,但并非原子的,包含了三个独立的操作(读取-修改-写入)由于不恰当的执行时序而出现不正确的结果(或者说计算结果的正确性取决于线程的交替执行顺序),这种情况称为竞态条件一种典型的竞态条件——“先检查后执行”首先观察到某个条件为真,然后根据这个条件做相应的动作,但事实上,在观察这个条件和做动作直接,观察的条件变为假了原创 2015-01-28 21:03:00 · 777 阅读 · 0 评论 -
Java并发编程实践笔记之-并发简史
计算机中加入操作系统,使多程序在单独的进程中同时执行成为了可能,目的有:提高资源的利用率通过时间分片使用户和程序公平第分享计算机资源编写多个程序完成多个任务比写一个程序完成所有任务要容易这些因素同样也促使了线程的出现:又称轻量级线程大多数现代操作系统都是以线程为基本调度单位的每个线程有各自的程序计数器,栈和局部变量同一个进程中的所有线程都共享进程的内存地址空间,所以能访问相同的原创 2015-01-28 21:09:50 · 311 阅读 · 0 评论