Java并发编程实战笔记】的更多相关文章

关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不会执行任何操作.无论位置V的值是否等于A,都将返回V原有的值.然后线程可以基于新返回的V值来做对应的操作,可以反复尝试.通常,反复重试是一种合理的策略,但在一些竞争很激烈的情况下,更好的方式是在重试之前首先等待一段时间或者回退,从而避免造成活锁问题.CAS的主要缺点就是,它将使调用者处理竞争问题,而…
线程安全性 编写线程安全的代码实质上就是管理对状态的访问,而且通常都是共享的,可变的状态. 一个对象的状态就是他的数据,存储在状态变量中,比如实例域或静态域.所谓共享是指一个对象可以被多个线程访问:所谓可变是指变量 的值在其生命周期之内可以改变. 无论何时只要多于一个线程访问给定的状态变量,而且其中的某个线程会写入该变量,此时必须使用同步来协调该线程对该变量的访问.java中首要 的同步机制是synchronized的关键字,它提供了独占锁.除此之外,术语“同步”还包括volatile关键字,显…
1.如何创建并运行java线程 创建一个线程可以继承java的Thread类,或者实现Runnabe接口. public class thread { static class MyThread1 extends Thread{ @Override public void run() { System.out.println("run a myThread1"); } } static class MyThread2 implements Runnable{ @Override pub…
如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误.有三种方式可以修复这个问题: i.不在线程之间共享该状态变量 ii.将状态变量修改为不可变的变量 iii.在访问状态变量时使用同步 什么是线程安全性? A:我们可以将单线程的正确性近似定义为“所见即所知”.在对“正确性”给出了一个较为清晰的定义后,就可以定义线程安全性 :当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的. 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这…
4.1设计线程安全的类 包含三个基本要素: 1.找出构成对象状态的所有变量 2.找出约束状态变量的不变性条件 2.简历对象状态的并发访问管理策略 对象的状态: 域 基本类型所有域, 引用类型包括被引用对象的域 同步策略:不违背对象不变条件下对其状态的访问进行协同. 同步策略规定了如何将不可变性,线程封闭,加锁机制结合起来维护线程的安全性,并且规定了那些变量由哪些锁保护,最好写正式文档. 1.收集同步需求 不变性条件中包含多个变量,任何访问相关变量的操作都需要持有保护这些变量的锁. 2.依赖状态的…
3.1 可见性 synchronized 不仅实现了原子性操作或者确定了临界区,而且确保内存可见性. *****必须在同步中才能保证:当一个线程修改了对象状态之后,另一个线程可以看到发生的状态变化. 1.失效值问题 以上类非线程安全,get和set在非同步情况下获取value值. 当一个线程修改value,另一个线程可能得到更新后的值,也可能得不到. 对get和set进行同步,可以是成为线程安全类. 2. long或者double 需要用volatile修饰或者用锁保护. 因为64位值可能被拆为…
1.ThreadLocal Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作.因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有一个指向同一个ThreadLocal变量的引用,但是这两个线程依然不能看到彼此的ThreadLocal变量域.ThreadLocal类提供了get和set等访问接口,这些方法为每个线程都存有一个独立的副本,因此每次get总是返回当前线程上一次最小使用set设置的值. private ThreadLocal myThreadLo…
. 5.1同步容器类 1.同步容器类的问题 复合操作,加容器内置锁 2.迭代器与concurrentModificationException 迭代容器用iterator, 迭代过程中,如果有其他线程修改容器,那么会抛出ConcurrentModificationException.迭代地方都需加锁 iterator是fail-fast及时失败机制. 解决方法:加锁可能死锁,复制容器性能有问题. 3.隐藏迭代器 加锁可以避免迭代抛出异常,那么所有对共享容器 迭代地方都需加锁.但是实际情况比较复杂…
1.同步容器类 同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁保护复合操作. 容器上常见的复合操作包括但不限于:迭代(反复访问数据,直到遍历完容器中所有的元素为止).跳转(根据指定顺序找到当前元素的下一个元素)以及条件运算(例如:如果没有则添加). 这些复合操作在没有客户端加锁的情况下仍然是线程安全的,但是当其他现场并发的修改容器时,它们就可能出现意料之外的行为. public static Object getLast(Vector list){ int lastIndex…
2.1 线程安全性 当多个线程访问某个类时,不论这些线程如何交替执行,这个类始终都能表现出正确的行为,且主调代码中不需要任何额外的同步或协同,则称这个类是线程安全的. 类不变性条件(Invariant):约束对象的状态 后验条件(Postcondition):约束对象操作的结果 保证正确的行为是指:任何操作都不会违背类不变性条件或后验条件.在线程安全类的对象的实例上执行的任何串行或并行操作都不会使对象处于无效状态. 2.2 原子性 竞态条件 某个计算过程的正确性取决于多个线程交替执行时序. 注:…