您的位置:首页 > 编程语言 > Java开发

java Thread学习(共享资源)

2016-10-12 16:25 162 查看

Thread2共享资源

java中的同步机制有两种:同步块(方法)和volatile变量。

锁:所提供了两种特性:互斥和可见性。

互斥(原子性):只允许一个线程持有某种锁。所以可以对共享的数据协调访问。Java内存模型中原子性变量操作是read、load、assign、use、store、write,大致可以认为基本数据类型(long/double除外)访问读写是具有原子性的。

可见性:保证在锁的期间对数据做出的修改,当释放锁之后该修改对于之后获得锁的线程是可见的。保证了线程获取到的值是最新被修改的。

java内存模型:在内存模型中线程存在于自身的线程栈中。在对数据的操作中,也是操作的数据的副本。通过read、load从主内存中读取数据,然后在线程栈中创建对应的副本,对副本进行assign、use操作,然后将结果写入线程栈中,最终write讲数据发回主内存。

Volatile变量

Volatile的特性:具有可见性,但是不具有原子性。也就是说线程能自动发现最新值。所以所每次使用变量的时候都会读取最新值。相当于是对变量的读和写操作加了一个锁。

Volatile对内存的可见性影响:volatile变量写-读可以用来实现内存之间的通信。例如可以使用volatile的flag,在写入后设为true,读取的时候判断是否为true。保证了写一定发生在读之前

synchronized变量

可以用来修饰代码块、方法、静态方法、类

修饰代码块时指定对象。

对象含有单一的锁,也就是说调用了一个synchronized方法后,该对象就会加上一个锁,访问对象中其他任意一个synchronized方法都会被挂起。

并发时,将域设为private非常重要,只有私有的才能被加锁

一个类也有一个锁,所以synchronized可以加到static方法上,用来个static数据加锁。

修饰一个类是,作用于所有的对象。也就是说所有对象都是一把锁

Lock

Lock对象需要手动创建、锁定、释放

java

Lock lock = new ReentrantLock();

lock.lock();

lock.unlock();


原子类

java SE5中引入了原子类,例如AtomicInteger、AtomicLong、AtomicReference等原子变量类,保证对变量操作的原子性

线程本地存储

ThreadLocal:线程局部变量。在每个线程中都创建副本。 如果一个属性不是线程安全的,但是又不需要在各个线程中共享这个属性可以使用ThreadLocal。所以通常是private static的,因为希望它与线程相关,而不是和对象相关

- set(T) 设置线程副本中的值

- get() 获取线程副本中的值

- initialValue:返回线程副本中的初始值。经常被用来设置初始值

- remove() 移除此线程中的局部变量的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 线程