java线程学习一

来源:互联网 发布:淘宝店网址怎么改 编辑:程序博客网 时间:2024/05/16 11:26

java线程基础知识:

对象的发布和逸出

  1. 发布指的是将一个对象的引用保存在其他代码可以看到的地方,可以是一个变量也可以是一个非私有的方法
  2. 逸出是指当我们在发布一个对象的时候可能会及间接的发布其他的对象的引用,若一个已经发布的对象可以通过非私有方法或者变量可以访问到另一个对象,则称之为对象的溢出

线程封闭

  1. 栈封闭:在jvm模型里面栈是存放变量和引用的,每个线程都有一个私有栈,而线程的共享内存区包括方法区,堆区,和运行时常量池,即每个线程都拥有一个相互独立的栈,而栈只是堆得一个引用而已,所以当一个线程通过栈修改了堆里面的对象,而另一个线程却完全不知道,这就会造成不同步,而加入每个线程操作的只是自己的栈区,不操作堆区,那么这样线程之间就不会互相干扰,若一个对象的引在用多个线程之间可以操作这是很危险的,而栈封闭指的是将对象或者引用保存在一个局部变量中,局部变量的属性之一就是封闭在执行线程之中,因为局部变量的作用域是一个代码块或者方法体,而且对于局部基本类型变量的引用,只有本方法才能引用,若是局部对象的引用这就是两码事了,所以基本类型的局部变量是封闭于线程之中的这句话指的是这个。
  2. TheradLocal:
    该类可以保证线程中的某个值和保存值得对象联系在一起,
    当调用ThreadLocal的时候,调用setInitialValue()方法,通过setInitialValue()创建一个副本,调用initialValue();

初次调用ThreadLocal的get方法会存一个副本

public T get() {        Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);//初次调用肯定是空        if (map != null) {            ThreadLocalMap.Entry e = map.getEntry(this);//不为空直接从map里面找出该线程            if (e != null)                return (T)e.value;        }        return setInitialValue();//调用setInitialValue()    }

在这个方法里面存入一个副本

private T setInitialValue() {        T value = initialValue();//获取初始值        Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);//创建一个map副本        if (map != null)            map.set(this, value);//存在就覆盖        else            createMap(t, value);//将当前的线程和值存入副本        return value;//返回当前对象    }

这样的话每一个线程都会有属于自己的一个类似键-值一样的一个关联
3. Ad-hoc线程封闭
这种封闭代表的是现成的封闭完全是由程序自己来实现,比如volatile或者final等等,这种封闭性太脆弱

线程封闭例子:
  1. Swing编程
  2. JDBC但是java并发编程实战P35提到

    JDBC并不要求Connection对象必须是线程安全的

    这句话感觉有点歧义

不变性

  1. 不可变对象一定是安全的,因为不可变对象任何线程无法修改
  2. 对象不可变需要满足三个条件
    • 对象常见之后就不可以再修改
    • 对象的所有域必须是final(若final修饰的是基本数据类型,而其一旦赋值后便不可以修改,而若final修饰的是引用,则代表该引用不可修改,但是其对象的内容是可以再次被修改的)
    • 对象必须正确的被创建

先占一个坑,有空再补。。

0 1
原创粉丝点击