java Thread学习(共享资源)

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() 移除此线程中的局部变量的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值