lock 的易错点
来源:互联网 发布:美国登月真假 知乎 编辑:程序博客网 时间:2024/06/12 19:28
如果按下面的方式写lock,你会发现lock并没有起到作用。
public static class count{ // private int i ; public void get(){ final ReentrantLock lock = new ReentrantLock(); //lock 声明在函数内 try{ lock.lock(); System.out.println(Thread.currentThread().getName()+" get begin"); Thread.sleep(100); System.out.println(Thread.currentThread().getName()+" get end"); lock.unlock(); }catch(InterruptedException e){ e.printStackTrace(); } } public void put(){ final ReentrantLock lock = new ReentrantLock(); //lock 声明在函数内 try{ lock.lock(); System.out.println(Thread.currentThread().getName()+" put begin"); Thread.sleep(100); System.out.println(Thread.currentThread().getName()+" put end"); lock.unlock(); }catch(InterruptedException e){ e.printStackTrace(); } } }
结果如下:
Thread-0 put beginThread-1 put beginThread-2 get beginThread-3 get beginThread-3 get endThread-0 put endThread-1 put endThread-2 get end
原因在于lock的声明在函数内,线程调用函数得到的lock值互不影响,所有并没有实现互斥。
改为如下:
public static class count{ final ReentrantLock lock = new ReentrantLock(); //lock 声明在函数外 public void get(){ try{ lock.lock(); System.out.println(Thread.currentThread().getName()+" get begin"); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()+" get end"); lock.unlock(); }catch(InterruptedException e){ e.printStackTrace(); } } public void put(){ try{ lock.lock(); System.out.println(Thread.currentThread().getName()+" put begin"); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()+" put end"); lock.unlock(); }catch(InterruptedException e){ e.printStackTrace(); } } }
结果如下:
Thread-0 get beginThread-0 get endThread-1 get beginThread-1 get endThread-2 put beginThread-2 put endThread-3 put beginThread-3 put end
阅读全文
0 0
- lock 的易错点
- Spin lock 和 Mutex lock的区别
- Application的Lock问题。
- Hibernate 的关键字lock
- Lock的使用
- Spin lock的学习
- postgreSQL 的 lightweight lock
- 学习lock的使用
- MAC的lock简介
- Lock-Free的理解
- Oracle的table lock
- Oracle的table lock
- Lock的简单运用
- .net lock的使用方法
- Java的Lock小结
- atom lock的实现
- lock的初始化值
- yum的lock 问题
- eclipse插件全集
- Java的API调用优化——容器
- SpringCloud服务注册中心比较:Consul vs Zookeeper vs Etcd vs Eureka
- 链表相关程序
- socket网络编程实现客户端和服务端通信
- lock 的易错点
- (转)机器学习中核函数的定义和作用是什么?
- Ip地址校验
- AngularJS $timeout和 $interval ,定时器手机验证码倒计时
- 数据结构之Set
- 商用流媒体解决方案
- Android 热修复 Tinker Gradle Plugin解析
- 欢迎使用CSDN-markdown编辑器
- Leetcode022. Generate Parenthesest