我们学习线程安全与同步的知识目的就是要实现一些可复用组件或编写出更大的程序。
java中类是对象抽象,那么怎么实现一个线程安全类是我们必须要知道的并正确使用的技术。
在设计线程安全类的过程中,需要包含以下三个基本元素:
找出构成对象状态的所有变量。
找出约束状态变量的不变性条件。
建立对象状态的并发访问管理策略。
package com.hom...
分类:
编程语言 时间:
2015-02-03 00:42:52
阅读次数:
119
我们前面所讲的一切其实都只是为了一个目标那就是能正确发布一个线程安全的对象。
一:线程封闭
这个很好理解如果一个变量是在一个线程中完成的状态改变,那么这个变量肯定是线程安全的。
我们常使用的是栈封闭和ThreadLocal类。
在java运行时内存区中有一个虚拟机栈,栈封闭说的就是这个栈,这个栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述描述的是java方法执行的内存模型:每个方法被...
分类:
编程语言 时间:
2015-02-02 07:10:09
阅读次数:
215
同步机制可以保证原子操作和内存可见性,但是同步机制对变量的访问性能是我们不得不考虑的问题,java语言提供了一种弱同步机制,volatile变量。
它的原理大致是这样的,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的...
分类:
编程语言 时间:
2015-02-01 23:21:33
阅读次数:
316
前三篇我们主要说了多线程访问共享可变状态时需要进行正确的同步处理,保证同一时刻只有一个线程访问相同的数据,我们使用synchronized关键字来实现原子性操作。今天我们在来认识一下同步的另一个重要方面:内存可见性,这个概念其实很好理解,就是保证在同一个时刻,共享可变状态对访问它的线程呈现出自己最新的状态变化。
我们经常遇到的情景是这样的,一个全局变量计数器,一个线程负责更新该数值,另一些线程获...
分类:
编程语言 时间:
2015-02-01 16:12:17
阅读次数:
240
一、操作系统中线程和进程的概念现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。线程是指进程中的一个执行流程,一个进程中可以运行多个...
分类:
编程语言 时间:
2015-01-31 19:22:07
阅读次数:
218
(一)volatile的使用
1、使用场景
(1)状态标识。用于实时指示某个重要性事件的发生,比如完成初始化或者停机。
volatile boolean toShutdown;
......
public void shutdown() { toShutdown = true; }
public void doWork() {
while (!...
分类:
编程语言 时间:
2015-01-31 09:27:55
阅读次数:
195
单线程环境下可以使用HashMap和TreeMap。如果不是遍历时需要按照Key的排序来返回结果,应该采用HashMap。
多线程环境下可以使用以下四种Map容器。
1)Collections.synchronizedMap(new HashMap());
2)ConcurrentHashMap
3)Collections.synchronizedSortedMap(new TreeMap())
4)ConcurrentSkipListMap
如果不需要遍历时需要按照Key的排序来返回结果,首选Concur...
分类:
编程语言 时间:
2015-01-30 17:41:51
阅读次数:
536
在前面的一篇中,总结了如何使用Lock和Condition对象。我们先总结一下有关锁和条件的关键之处:
锁用来保护代码片段,任何时刻只能有一个线程执行被保护的代码。锁可以管理试图进入被保护代码段的线程。
锁可以拥有一个或多个相关的条件对象。每个条件对象管理那些已经进入被保护的代码段但还不能运行的线程。
synchronized关键字
Java中的每一个对象都有一个内部锁;...
分类:
编程语言 时间:
2015-01-30 09:17:35
阅读次数:
234
看到很多框架中都使用了ThreadLocal ,单从名字来说很可能把他理解成为一个“本地线程”之类的玩意儿。。。
先上代码:
package com.tiger.Thread.concurrent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.u...
分类:
编程语言 时间:
2015-01-30 09:04:40
阅读次数:
166
有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…由于线程执行的不确定性,要保证这样有序的输出,必须控制好多线程的同步。线程同步有两种基本方法:(1)synchronized(2)wait,notify,notifyAll现在分别采用这两种方法来解答这道题目。pu...
分类:
编程语言 时间:
2015-01-29 17:29:18
阅读次数:
189