线程2

synchronized

​ synchronized,又称内置锁机制,是通过对线程访问的对象加锁的方式来实现线程安全的 ,只有拿到锁的线程才可以访问加锁的对象,可以实现线程间的数据共享(传递),并且保证了线程安全。synchronized可以是锁类中的方法、成员变量、也可以将整个类全部加锁。

​ 错误加锁的原因:

在这里插入图片描述

通过这种方式我们可以看到:

在这里插入图片描述

这里执行的结果,数据地址是不确定的,从而导致了线程不安全问题,而我们来对对应的class文件反编译来看,
在这里插入图片描述
这里对应的Integer i类是变化的,所以说当他没变化一次,以前的对应对应的锁就被释放了,而是锁住了新生成的i,所以就会造成,其他释放的对应就可以被其他线程使用,而使用哪一个对象,就需要看操作系统心情,所以这是一种错误的加锁方式,而正确的方式,是要锁住一个不变的对象。

volatile

volatile轻量级的同步机制,当我们给变量加上改标识符之后,线程会感知其他线程对变量的修改,,但是不一定能够按时感知到。

解适场景:用于一写多读的情况。

ThreadLocal

ThreadLocal是为线程提供一个变量副本,实现了线程的隔离,但是线程间的数据是独立的,不可进行线程之间的共享。就比如说我们访问数据库,就可以将连接信息保存在ThreadLocal中。

ThreadLocal 类接口很简单,只有 4 个方法,我们先来了解一下:

• voidset(Objectvalue)

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

• publicObjectget()

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

• publicvoidremove()

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

​ • protectedObjectinitialValue()

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

calRESOURCE=new ThreadLocal();

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值