线程间的共享和协作

线程间的共享和协作


内置锁机制:Java支持多个线程同时访问一个对象或者对象的成员变量,关键字synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多 个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性,又称为内置锁机制。


对象锁是用于对象实例方法,或者一个对象实例上的。


类锁是用于类的静态方法或者一个类的class对象上的


注意:

类锁其实锁的是每个类的对应的class对象。


volatile,最轻量的同步机制,volatile保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即 可见的,不加volatile时,子线程无法感知主线程修改了ready的值,从而不会退出循环,而加了volatile后,子线程可以感知主线程修改了ready的值,迅 速退出循环,volatile最适用的场景:一个线程写,多个线程读。


ThreadLocal和Synchonized都用于解决多线程并发访问。


synchronized是利用锁的机制,使变量或代码块在某一时该仅仅能被一个线程访问。

ThreadLocal为每个线程都提供了变量的副本,使得每个线程在某一时间访问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。


ThreadLocal的使用

ThreadLocal类接口很简单,只有4个方法

void set(Object value)

设置当前线程的线程局部变量的值。


public Object get()

该方法返回当前线程所对应的线程局部变量。

public void remove()

将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。

protected Object initialValue()

返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。

public final static ThreadLocal<String> RESOURCE = new ThreadLocal<String>();RESOURCE代表一个能够存放String类型的ThreadLocal对象。此时不论什么一个线程能够并发访问这个变量,对它进行写入、读取操作,都是线程安全的。

了解更多知识,请关注公众号:itjungle

后面有更精彩内容发布。欢迎关注:itjungle

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章