1.java.util.concurrent

线程同步:

  • 是因为多线程读写竞争资源需要同步
  • Java语言提供了synchronized/wait/notify来实现同步
  • 编写多线程同步很困难

所以Java提供了更高级的java.util.concurrent包:

  • 更高级的同步功能
  • 简化多线程程序的编写
  • JDK>= 1.5

2.ReetrantLock

java.util.locks.ReentrantLock用于替代synchronized加锁

synchronized是Java语言层面提供的,不需考虑异常

ReentrantLock是普通的Java类,要用try...finally来保证锁能够正确释放



当我们使用ReenTrantLock的时候,我们首先要通过new ReentrantLock()新建一个Lock对象。然后我们先试图用lock()方法获得当前对象的锁。如果我们获得锁成功,就进入try代码,最后在finally中用unlock()来释放这个锁。

注意:lock()方法必须在try代码之外完成。因为lock()可能会失败,而unlock()一定要在finally中完成。

class Count{
final Lock lock = new ReetrantLock(); //获得ReentrantLock对象
public void inc(){
lock.lock(); //获得当前对象的锁可能会失败,所以要放在try...finally外面
try{
n = n + 1;
}finally{
lock.unlock(); //释放锁
}
}

ReentrantLock:

  • 可重入锁,一个线程可多次获取同一个锁
  • lock()方法可获取锁
  • tryLock()方法可尝试获取锁并可指定超时。
class Counter{
final Lock lock = new ReentrantLock();
private void inc() throws InterruptedException{
if(lock.tryLock(1, TimeUnit.SECONDS)){
try{
n = n + 1;
}finally {
lock.unlock();
}
}
}
}

使用ReentrantLock比直接使用synchronized更安全,因为synchronized会导致线程要么获得锁,要的永远等待下去。而使用ReentrantLock的时候,我们通过tryLock()在失败的时候不会导致死锁。

3.示例

import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Lock; class Counter{
private Lock lock = new ReentrantLock();
private int value = 0;
public void add(int m){
lock.lock();
try{
value += m;
}finally {
lock.unlock();
}
}
public void dec(int m){
lock.lock();
try{
value -= m;
}finally {
lock.unlock();
}
}
public int get(){
lock.lock();
try{
return this.value;
}finally {
lock.unlock();
}
}
}
public class Main{
final static int LOOP = 100;
public static void main(String[] args) throws Exception{
Counter counter = new Counter();
Thread t1 = new Thread(){
public void run(){
for(int i=0;i<LOOP;i++){
counter.add(1);
}
}
};
Thread t2 = new Thread(){
public void run(){
for(int i=0;i<LOOP;i++){
counter.dec(1);
}
}
};
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(counter.get());
}
}

4.总结:

  • ReentrantLock可以替代synchronized
  • ReentrantLock获取锁更安全
  • lock()获取锁在try...finally之前
  • 必须使用try... finally保证释放锁

最新文章

  1. 基于 Annotation 拦截的 Spring AOP 权限验证方法
  2. iOS开发中多线程间关于锁的使用
  3. 发现IE6的一个BUG,添加受信任站点后,页面无法跳转
  4. 清空form表单下所有的input值-------------jquery
  5. ajax简单案例:返回json型
  6. Mongodb 级联删除查询操作
  7. NS记录
  8. Key Task
  9. [Locked] Unique Word Abbreviation
  10. mac下设置命令别名
  11. 使用hibernate 分表做增删改查
  12. check the manual that corresponds to your MySQL server version for the right syntax的错误解析
  13. HDU1754 I hate it(线段树 单点修改)
  14. java中的时间类型
  15. Linux 进程同步和通信
  16. 递归 + OS模块
  17. PyCharm 新建文件时默认添加作者时间等
  18. [Linux]《鸟哥的私房菜》笔记 (缓慢更新)
  19. LOJ#2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On
  20. BEGIN-2_蓝桥杯_序列求和

热门文章

  1. flutter 动态申请权限
  2. 查看framework版本
  3. python数据结构之图的实现方法
  4. AtCoder ABC 126F XOR Matching
  5. CSS3教程:Responsive框架常见的Media Queries片段
  6. Neo4j中實現自定義中文全文索引
  7. c++智能指针(unique_ptr 、shared_ptr、weak_ptr、auto_ptr)
  8. Activiti学习笔记5 — 常用API解析
  9. JAVA读取PROPERTIES文件方式一
  10. .net 裁剪图片