java并发程序和共享对象实用策略】的更多相关文章

java并发程序和共享对象实用策略 在并发程序中使用和共享对象时,可以使用一些实用的策略,包括: 线程封闭 只读共享.共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它.共享的只读对象包括不可变对象和事实不可变对象 线程安全共享.线程安全地对象在器内部实现同步. 保护对象.被保护的对象只能通过持有特定的锁来方访问. 线程封闭 当访问共享的可变数据时,通常需要使用同步.一种避免使用同步的方式就是不共享数据.如果仅在单线程内访问数据,就不需要同步.这种技术被称为线程封闭,它是实现线程安全性…
源自于:http://stackoverflow.com/questions/439173/message-pumps-and-appdomains/442316 程序与程序之间共享对象: MarshalByRefObject 示范代码: public class Container<T> : MarshalByRefObject { private T _value; public T Value { get { return _value; } set { _value = value;…
上一篇介绍了如何通过同步多个线程避免同一时刻访问相同数据,本篇介绍如何共享和发布对象,使它们被安全地由多个进程访问. 1.可见性 通常,我们无法保证执行读操作的线程能看到其他线程写入的值,因为每个线程都由自己的缓存机制.为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. public class NoVisibility { private static boolean ready; private static int number; private static class Re…
一.序言 当我们需要使用线程的时候,我们可以新建一个线程,然后显式调用线程的start()方法,这样实现起来非常简便,但在某些场景下存在缺陷:如果需要同时执行多个任务(即并发的线程数量很多),频繁地创建线程会降低系统的效率,因为创建和销毁线程均需要一定的时间. 线程池可以使线程得到复用,所谓线程复用就是线程在执行完一个任务后并不被销毁,该线程可以继续执行其他的任务.java.lang.concurrent包中的Executors类为我们创建线程池提供了方便. 二.Executors的简单使用示例…
概述 java cocurrent包提供了很多并发容器,在提供并发控制的前提下,通过优化,提升性能.本文主要讨论常见的并发容器的实现机制和绝妙之处,但并不会对所有实现细节面面俱到. 为什么JUC需要提供并发容器? java collection framework提供了丰富的容器,有map.list.set.queue.deque.但是其存在一个不足:多数容器类都是非线程安全的,及时部分容器是线程安全的,由于使用sychronized进行锁控制,导致读/写均需尽心锁操作,性能很低. java c…
概述 BlockingQueue顾名思义'阻塞的队列',是指在:队列的读取行为被阻塞直到队列不为空时,队列的写入行为被阻塞直到队列不满时.BlockingQueue是java.util.concurrent工具包(jdk1.5版本引入,作者:Doug Lea)的重要基础工具,在ThreadPoolExcutor及tomcat等服务端容器中都有使用到.从代码层面剖析BlockingQueue的实现细节. 类图 对象存储 BlockingQueue中的对象可以存放在:数组.链表中,对应的就是Arra…
一.非原子的64位操作: 当线程在没有同步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值,这种安全性保证被称为最低安全性.最低安全性适用于绝大多数变量,但存在一个例外:非volatile类型的64位数值变量(double,long),Java内存模型要求,变量的读取和写入操作都必须是原子操作,但对于非volatile型的long,double变量,JVM允许将64位的读操作或写操作分解为两个32位的操作,当读取一个非volatile类型的long…
可见性问题 可见性是指一个线程对共享变量进行了修改,其他线程能够立马看到该共享变量更新后的值,这视乎是一个合情合理的要求,但是在多线程的情况下,可能就要让你失望了,由于每个 CPU 都有自己的缓存,每个线程使用的可能是不同的 CPU ,这就会出现数据可见性的问题,先来看看下面这张图: 对于一个共享变量 count ,每个 CPU 缓存中都有一个 count 副本,每个线程对共享变量 count 的操作的只能操作自己所在 CPU 缓存中的副本,不能直接操作主存或者其他 CPU 缓存中的副本,这也就…
如何正确停止一个线程 1)共享变量的使用 中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务.线程必须周期性的核查这一变量(尤其在冗余操作期间),然后有秩序地中止任务.当线程等待某些事件发生而被阻塞,又会发生什么?果线程被阻塞,它便不能核查共享变量,也就不能停止.这在许多情况下会发生,例如调用Object.wait().ServerSocket.accept()和DatagramSocket.receive()时.   2)T…
概述 Excutor这个接口用的不多,但是ThreadPoolExcutor这个就用的比较多了,ThreadPoolExcutor是Excutor的一个实现.Excutor体系难点没有,大部分的关键点和设计思路都在javadoc中描述的特别详细,但有必要做一下梳理,以便在后续开发场景中,更好地使用jdk提供的灵活的api. Excutor接口主要用于解耦任务执行者和任务发起者,jdk8的javadoc写的非常详细.因此,Excutor这个系列的类都冲着这个目标来实现,当然,很多实现类更是在特定的…