Java锁(Synchronized & ReentrantLock)
一、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 – 如何使用Intent集合调用Activity后,getIntent()返回
- java – 将属性’antiJARLocking’设置为’true’没有找到匹
- java – 获取List中特定元素的数量
- java – WebSphere 7.从另一个应用程序注入EJB
- java – 在一个JFrame中使用两个JPanels
- java-带@EnableWebFlux批注的SpringWebFlux错误
- Java相关知识2
- java中自定义Spring Security权限控制管理示例(实战篇)
- java – 带有自定义FileSystemView实现的JFileChooser
- 确定JavaFX中的调用节点更改侦听器