java多线程学习(一)
最近有空在学习java多线程方面的知识,随手摘录一些。
多线程或者说编写并发程序,最重要的一点是:正确管理共享的可变状态 writing correct concurrent programs is primarily about managing access to shared, mutable state.
1.volatile变量只能确保可见性,通常用作某个操作完成、发生中断或者状态的标志。当出现以下条件时,应该使用:
- 对变量的写不依赖于变量的当前值或者只有单个线程用于更新变量值。
- 变量不会与其他状态变量一起纳入不变性条件中。
- 访问变量时不需要加锁。
2.线程封闭是一种简单的避免同步的手段,维持线程封闭性的一种规范方法是ThreadLocal,它为每个线程存有一份独立的副本。ThreadLocal<T>有点类似Map<Thread,T>,会在类之间引入耦合。
3.有一类对象天生是安全的,即一旦构造就不会在改变的对象(Immutable object)。对于界定final对象java语言没有定义,immutable对象:正确创建(安全的构造函数),创建以后不再改变,所有域都是final类型(不是必须)。
不可变的对象引用与不可变对象不同,前者依旧有改变的可能,这类涉及到拷贝,返回等问题。
View Code
public class Super { private int num; private Sub child; public Super(int num, Sub child) { super(); this.num = num; this.child = child; } public int getNum() { return num; } public Sub getChild() { /*return (Sub)child.clone();*/ return child; } /** * @param args */ public static void main(String[] args) { Sub sub = new Sub(1, 1); Super sup = new Super(1, sub); System.out.println(sup.getChild()); sup.getChild().setI(2); /*sup hold sub ref sub.setI(2);*/ System.out.println(sup.getChild()); } } class Sub implements Cloneable { int i; int j; public Sub(int i, int j) { this.i = i; this.j = j; } /*clone*/ @Override protected Object clone() { try { return super.clone(); } catch (Exception e) { throw new InternalError(); } } @Override public String toString() { return "elements: " + i + "and" + j; } /*get and set methods*/ }
4.安全发布对象


浙公网安备 33010602011771号