线程同步的解决

1.synchronized关键字

1.synchronized关键字解决了多个线程之间访问资源的同步性,synchronized可以保证被它修饰的方法或代码块,在任何时候都只能有一个线程执行它。

2.synchronized主要有三种使用方式:

- 修饰实例方法

- 修饰静态方法

- 修饰代码块

3.synchronzied关键字的底层原理:

synchronized同步语句块的实现,使用的是monitorenter和mointorexit指令,其中mointorenter指令指向同步代码块开始的位置,monitorexit指令则指向同步代码块的结束位置。

synchronized修饰的方法使用的是acc_synchronized标识,该标识指明了该方法是一个同步方法。JVM通过该标识来辨别一个方法是否是同步方法,从而执行相应的同步调用。

2.Volatile

1.volatile关键字除了防止JVM的指令重排,还有一个重要的作用,就是保证变量的可见性。允许成员变量可见,但是不保证原子操作

2.synchronized关键字和volatile关键字的区别

- synchronized和volatile关键字是两个互补的存在,而不是对立的存在。

- volatile主要用于解决变量在多个线程之间的可见性。而synchronized解决的是多个线程之间访问资源的同步性。

- 性能:volatile关键字是线程同步的轻量级实现,所以它的性能比synchronized要好

- 使用场景:volatile只能用于变量,而synchronized可以修饰方法以及代码块。

- volatile能保证数据的可见性,但不能保证数据的原子性。synchronized两者都能保证。

3.ThreadLocal

1.ThreadLocal类主要解决的就是让每个线程都拥有自己本地的变量,可以将ThreadLocal类形象的比喻为存放数据的盒子,盒子中可以存储每个线程的私有数据。

2.ThreadLocal原理:

当我们把所需的可变成员变量放到ThreadLocal中时,其实最终的变量是放在了当前线程的ThreadLocalMap中。

ThreadLocalMap是ThreadLocal的静态内部类,它的key为当前对象的Thread对象,值为Object对象。

ThreadLocal类中可以通过Thread.currentThread()获取当前线程对象,直接通过getMap(Thread t)可以访问到该线程的ThreadLocalMap对象。

3.ThreadLocal内存泄露问题:

ThreadLocalMap中使用key为ThreadLocal的弱引用,而value则是强引用。如果ThreadLocal没有被外部强引用的情况下,在垃圾回收的时候,key会被清理掉,而value不会被清理掉。这样的话,ThreadLocalMap中就会出现key为null的Entry。如果我们不做任何措施,value就永远不会被GC回收,这个时候就可能会产生内存泄漏。

ThreadLocalMap的实现中考虑到了这个问题,在我们调用set()、get()、remove()方法的时候,会清理掉key为null的记录。所以,使用完ThreadLocal后,最好手动调用remove()方法。

4.Lock锁:ReentrantLock

1.lock是一个接口,里面只定义了lock()、trylock()、unlock()等方法

2.锁【lock.lock()】必须紧跟try代码块,且unlock要放到finally第一行。

3.Synchronized 和 Lock

1)Synchronized是关键字,Lock是接口

2)Synchronized可以修饰方法和代码块,lock只可以给代码块上锁

3)Synchronized不能判断是否获取到了锁,Lock可以通过tryLock()方法来判断是否上了锁

4)Synchronized会自动释放锁,Lock需要通过unlock()方法手动释放

5)Synchronized 是同步阻塞,采用悲观并发策略,Lock是同步非阻塞,采用乐观并发策略

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值