线程的同步

线程的同步

线程同步

  1. 同步的方式,解决了线程安全的问题。
  2. 操作同步代码只有一个此线程参与,其他线程等待,相当于单线程,效率低。

    方式一:同步代码块

  1. synchronized(同步监视器){
  2. //需要被同步的代码,操作共享数据的代码即为需要被同步的代码
  3. }
  1. 共享数据
    多个线程共同操作的变量
  2. 同步监视器
    俗称:锁,任何一个对象都可以充当锁。要求:多个线程必须共用一把锁。

    方式二:同步方法

如果操作共享数据的代码在一个方法中,我们可以把该方法声明为同步的。

方式三:Lock(锁)

  1. 使用接口lock的子类ReentrantLock类的实例
    1. //实例化ReentrantLock类
    2. ReentrantLock lock = new ReentrantLock();
    3. //加锁
    4. lock.lock();
    5. //待同步的代码
    6. //解锁
    7. lock.unlock();

    经典面试题:synchronized与lock的区别

  2. 相同点:
    1. 都用来解决线程安全问题
  3. 不同点:
    1. lock需要再调用一次unlock

      死锁

当两个线程都持有对方正在等待的锁就会出现死锁问题。

释放锁的操作

  1. 释放锁的操作
    1. 同步代码执行完毕
    2. 遇到break、return终止
    3. 出现异常、没有处理
    4. wait()、join()
  2. 不释放锁的操作
    1. sleep()和yield()方法 2. ```