首页 > 编程语言 > 详细

Java锁(Synchronized & ReentrantLock)

时间:2019-09-28 19:00:17      阅读:62      评论:0      收藏:0      [点我收藏+]

一、Synchronized

1.作用

a. 多线程同步代码,保证方法或者代码块在运行时,同一时刻只有一个线程可以进入到临界区(互斥性)

b. 保证线程间共享变量的修改及时可见(可见性)

c. 有效解决重排序问题(有序性)

 

2. 用法:

a. 修饰函数,即普通同步方法,锁是当前实例对象 public void synchronized A(){}

b. 静态同步方法,锁是当前类的class对象 public static void synchronized A(){}

c. 修饰函数内的语句块,即同步代码块,锁是括号中的对象 synchronized(obj){}

d. Java中的每个对象都可以作为锁,获取的锁都是对象

e. 每个对象只有一个锁(lock)与之关联

f. 同步需要很大的系统开销,可能造成死锁;尽量避免无谓的同步

 

3. 作用域

a. 某个对象实例内的方法,不同对象的实例内的方法不相干扰,其他线程可以同时访问相同类的其他对象实例中的synchronized方法

b. 某个类的范围,一般是静态方法,可以防止多个线程同时访问相同类中的synchronized方法

 

4、wait(),notify(),notifyall()进行线程间通信

a. 例如生产者消费者模式,生产者发现缓冲区满了,就wait(),消费者从缓冲区消费了,就notify()或者notifyall()

b. 必须放在synchronized块中,否则,如果缓冲区只有一个产品,消费者先notify(),生产者再wait(),就会进入死锁

 

5、锁的状态

a. 无状态

b. 偏向锁状态

c. 轻量级锁状态

d. 重量级锁状态

 

二、ReentrantLock

1. 当使用手把手的进行锁获取和释放,使用synchronized关键字不容易实现,所以引入lock

2. 在代码中使用

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
  while(条件判断表达式) {
      condition.wait();
  }
 // 处理逻辑
} finally {
    lock.unlock(;
}

 

 

 

 

参考:

https://www.jianshu.com/p/19f861ab749e

https://www.jianshu.com/p/4358b1466ec9

 

Java锁(Synchronized & ReentrantLock)

原文:https://www.cnblogs.com/june0816/p/7295719.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!