java 总结几种线程异步转同步的方法
来源:互联网 发布:淘宝店铺导航条背景色 编辑:程序博客网 时间:2024/05/22 17:07
在做一款app的时候,用到了一个异步执行的api,而我想要的是同步执行,查了一些资料,对几种情况下的线程同步做一下总结。
一、共享资源的同步
问题:当一个资源被多个线程访问会发生错误,只能允许一个线程访问时。
1.syschronized实现
使用syschonized关键字可对某个块或者方法进行限制访问,即当一个线程获得块或者方法的访问权后,其他线程将不能访问。
当使用sychronized修饰某个方法(非static)时,作用对象将是这个方法所属的对象,与同步块同理。值得注意的是,如果synchronized修饰的是static方法或变量时,作
用对象将是static所在的类而非某个对象,因为static方法不属于任何一个对象,而是属于类。
2.Lock实现
可以看出,syschronized的作用的是对象或者类,这显然不太灵活,而Lock则比其更加灵活一些。
这里使用的是ReentrantLock,另外还有ReadWriteLock。
ReentranLock的优点(摘自:https://github.com/pzxwhc/MineKnowContainer/issues/16)
lock在获取锁的过程可以被中断。
lock可以尝试获取锁,如果锁被其他线程持有,则返回 false,不会使当前线程休眠。
lock在尝试获取锁的时候,传入一个时间参数,如果在这个时间范围内,没有获得锁,那么就是终止请求。
synchronized 会自动释放锁,lock 则不会自动释放锁。
二、异步转同步
问题:某些API是异步的,而我们想让其同步。如:A、B两个方法异步执行,由于某些需求,想让A方法执行完之后再执行B方法。
1.CountDownLatch解决
使用CountDownLatch可以实现同步,它好比计数器,在实例CountDownLatch对象的时候传入数字,每使用一次 .countDown() 方法计数减1,当数字减到0时, .await()方法后的代码将可以执行,未到0之前将一直阻塞等待。
如代码所示,t1线程获得num的值,t2线程给num赋值,显然t2需要在t1之前执行结束,而t2执行的时间却比t1长,故使用CountDown对t1进行阻塞等待t2完成。此外,也可以给await(设置参数),到达一定时间计数未变为0也可执行。
- java 总结几种线程异步转同步的方法
- java 总结几种线程异步转同步的方法
- Java-几种线程同步的方法
- 线程同步的几种方法的总结
- 线程同步的几种方法的总结
- 实现线程同步的几种方法
- C#线程同步的几种方法
- C#线程同步的几种方法
- C#线程同步的几种方法
- C#线程同步的几种方法
- C#线程同步的几种方法
- C#线程同步的几种方法
- 线程同步的几种方法
- 线程同步的几种方法
- C#线程同步的几种方法
- 线程同步的几种方法
- C#线程同步的几种方法
- C#线程同步的几种方法
- 99. Recover Binary Search Tree
- UVA.12034 Race (递推)
- 嵌入式每日学习心得 守护进程
- 基础校验
- leetcode problem3解题报告
- java 总结几种线程异步转同步的方法
- linux学习命令 一
- VS中使用QT,多国语言翻译问题
- JAVA基础知识二
- 上Google 最简单的办法 更改hosts 见laod
- 深入理解Java虚拟机——JVM、DVM(dalvik)和ART之间的区别
- 嵌入式每日学习心得 线程
- Java中Volatile关键字详解
- Spring Boot插件spring tool suite安装及使用