多线程 lock
来源:互联网 发布:linux 访问ip 端口 编辑:程序博客网 时间:2024/06/08 05:33
之前有说过synchroniaed 同步,这次来学习下一个另一个同步 lock。
首先来看下帮助文档:
这是lock接口中的所有方法,这次说道的有lock(),unlock(),tryLock(),tryLock(long time, TimeUnit unit)
依然是先上一个结果类
public class Result { private int val=0;//结果 private int pVal = 0; private Lock resultLock = new ReentrantLock(); public void sum(int num){//合方法 resultLock.lock();//锁 try { if(pVal != val){ pVal = val; } pVal = val + num; Thread.sleep((int) Math.random() * 1000);//模拟事物耗时 System.out.println(Thread.currentThread().getName()+"调用sum("+num+") 现值:"+pVal); } catch (InterruptedException e) { e.printStackTrace(); } finally { resultLock.unlock();//释放锁 System.out.println(Thread.currentThread().getName()+" unlock() "); } val=pVal; } public static void main(String[] args) { Result rt = new Result(); for(int t=0;t<5;t++){ new AddThread(rt,t).start(); } }}
再写个添加线程
public class AddThread extends Thread { private Result rt ; private int add ; AddThread(Result rt, int add) { this.rt = rt; this.add = add; } @Override public void run(){ rt.sum(add); }}
那么tryLock()的作用是什么呢?仅在调用时锁为空闲状态才获取该锁。 而tryLock(long time, TimeUnit unit) 是如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。 TimeUnit 参数:
那么接下来就用用他,只要把sum()代码修改一点就行了
public void sum(int num){//合方法,这里用了同步 //resultLock.lock(); if(resultLock.tryLock()) { try { if (pVal != val) { pVal = val; } pVal = val + num; Thread.sleep((int) Math.random() * 1000);//模拟事物耗时 System.out.println(Thread.currentThread().getName() + "调用sum(" + num + ") 现值:" + pVal); } catch (InterruptedException e) { e.printStackTrace(); } finally { resultLock.unlock(); System.out.println(Thread.currentThread().getName() + " unlock() "); } val=pVal; } }
运行结果:
这里我欧文们看到因为获取不到锁因此只加了一次,但是如果用tryLock(long time, TimeUnit unit) (这里我模拟事物时间是<= 1秒的)因此我设置等待一秒,将代码修改如下
try { if(resultLock.tryLock(1, TimeUnit.SECONDS)) { ... } catch (InterruptedException e) { e.printStackTrace(); }
阅读全文
0 0
- 多线程 lock
- 多线程学习笔记:lock
- lock 多线程中的用法
- Java多线程---Lock类
- java多线程-Lock
- 多线程同步(Lock)
- Java 多线程:Lock 关键字
- 多线程中lock用法
- Java 多线程:Lock接口
- Java 多线程:Lock 关键字
- C#多线程Lock
- 多线程中的Lock小结
- Java多线程--Lock接口
- 多线程(四)--Lock
- 多线程中的LOCK锁
- 多线程中lock的应用
- 利用lock实现多线程同步
- Java多线程4- Lock、Condition
- 第四节 java String对象的创建 与 “+”拼接字符串
- IntelliJ IDEA导入mysql-connector-java-5.1.44-bin.jar
- Android中JNI(二)------java调用C和C回调java
- wm_concat函数用法
- html 空格符号 nbsp; ensp; emsp; 介绍以及实现中文对齐的方法,
- 多线程 lock
- 常用并行计算算子原理及其在LightGBM中的实现
- Json:前台对象数组传到后台解析
- BZOJ4556:[Tjoi2016&Heoi2016]字符串 (后缀自动机+树上倍增+二分答案+线段树合并)
- Linux下的ip命令,ifconfig已经过时了
- IE10 、IE11 CSS Hack
- Java中的byte和二进制梳理
- ps-人物精修
- AngularJS 深入理解 $scope