玩转Java多线程(Lock.Condition的正确使用姿势)
转载请标明博客的地址
本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献
- 个人博客:https://www.cnblogs.com/haibiscuit/
- 个人github: https://github.com/haibiscuit?tab=repositories
看到就是赚到,本博客只会贴出干货,欢迎光顾
本篇讲的是lock.condition()的正确使用方式(也是之前看过的一篇,今天又把他实现出来)
首先,代码逻辑规则如下:
1.使用3个线程依次打印ABC
直接上代码:
package Thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
*
* @ClassName: LockConditionTest
* @Description:三个线程依次打印ABC
* @author:
* @date: 2019年6月27日 下午4:31:41
* @version 1.8.0
* @param
*
*/
public class LockConditionTest{
public static void main(String[] args) {
final AlternateDemo ad = new AlternateDemo();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
ad.loopA();
}
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
ad.loopB();
}
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
ad.loopC();
System.out.println("-----------------------------------");
}
}
}, "C").start();
}
}
class AlternateDemo {
private int number = 1; //当前正在执行线程的标记,相当于状态标记
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
public void loopA() {
lock.lock();
try {
//1. 判断
if (number != 1) {
condition1.await();
}
//2. 打印
System.out.println(Thread.currentThread().getName());
//3. 唤醒
number = 2;
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void loopB() {
lock.lock();
try {
//1. 判断
if (number != 2) {
condition2.await();
}
//2. 打印
System.out.println(Thread.currentThread().getName());
//3. 唤醒
number = 3;
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void loopC() {
lock.lock();
try {
//1. 判断
if (number != 3) {
condition3.await();
}
//2. 打印
System.out.println(Thread.currentThread().getName());
//3. 唤醒
number = 1;
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
总结:1.与wait对比,wait方式需要依赖synchronized代码块,而condtion.wait()依赖Lock对象,并且代码更加灵活
2.condition.wait()可以将不同条件下的线程放入不同的等待队列,而单纯的wait()方法会将所有情况下的线程放入一个等待队列,这样在大量线程唤醒时会造成资源浪费
3.使用Lock对象进行同步,这样线程同步只需要依赖Lock对象,而使用原始的synchronized(this){}进行同步,需要依赖当前对象,笔者更喜欢Lock同步的方式
玩转Java多线程(Lock.Condition的正确使用姿势)的更多相关文章
- Java多线程——Lock&Condition
Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. package ...
- 玩转java多线程(wait和notifyAll的正确使用姿势)
转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...
- java多线程Lock接口简介使用与synchronized对比 多线程下篇(三)
前面的介绍中,对于显式锁的概念进行了简单介绍 显式锁的概念,是基于JDK层面的实现,是接口,通过这个接口可以实现同步访问 而不同于synchronized关键字,他是Java的内置特性,是基于JVM的 ...
- Java多线程Lock
JDK5以后为代码的同步提供了更加灵活的Lock+Condition模式,并且一个Lock可以绑定多个Condition对象 1.把原来的使用synchronized修饰或者封装的代码块用lock.l ...
- 【玩转SpringBoot】配置文件yml的正确打开姿势
序言 在很久以前,Spring的配置文件是基于XML的.它的名字就是applicationContext.xml,没错,就只有这一个xml文件. 它里面配置了所有的东西.但是数据库信息通常会单独拿出来 ...
- java 多线程 day13 condition 线程通信
/** * Created by chengtao on 17/12/5. * Condition 类似 wait和notify,解决线程间的同步问题 */ import java.util.conc ...
- java多线程-Lock
大纲: Lock接口 synchronized&Lock异同 一.Lock public interface Lock { void lock(); void lockInterruptibl ...
- java多线程lock的使用
看代码: package com.ming.thread.reentrantlock; import java.util.concurrent.locks.Lock; import java.util ...
- 玩转Java多线程(乒乓球比赛)
转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...
随机推荐
- Struts2——(4)OGNL与struts标签
一.OGNL Object Graphic Navigation Language 对象图导航语言 依赖于 ognl.jar包 OGNL不是Struts框架独有的,它是和框架独立的一种技术. 例如: ...
- IIS元数据库失败该如何解决-重新安装ASP.NET
装了VS2005再装IIS,结果出了些小问题 “访问IIS元数据库失败 ” 思考可能是次序出了问题,解决 1.打开CMD,进入 C:\WINDOWS\Microsoft.NET\Framework\v ...
- Exception: java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams
RelativeLayout title_bg = (RelativeLayout)FTU_Bluetooth.this.findViewById(R.id.titlebar); LinearLayo ...
- string操作
常用的功能测试: #! -*- coding:utf-8 -*- import string s = 'Yes! This is a string' print '原字符串:' + s print ' ...
- WPF-3D动效-文字球形环绕
原文:WPF-3D动效-文字球形环绕 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013224722/article/details/81784 ...
- leetcode先刷_Pascal's Triangle II
三角相对简答题.第一个问题是太简单.我不沾了,我一定会写.其实没什么的第二个问题,与这个问题计算路径有点像一个三角形,假定输入是n,然后从第一行计数到第一n行,保存在数据线上的时间到,由于只有相关的事 ...
- ng-alain 复用标签相关设置
排除复用 import { ReuseTabMatchMode, ReuseTabService } from '@delon/abc'; export class StartupService { ...
- DELPHI7中 TObjectList sort排序问题
网上收集了一点东西 TOBJECTLIST里,有自带的排序功能 TLIST,TSTRINGLIST也有,MS是一样的 SORT里有一个参数: Compare:TListSortCompare 那我们先 ...
- WPF特效-拼图游戏
原文:WPF特效-拼图游戏 此文主要描述我实现碎片化的便捷过程. 步骤1: 选取参考图如下(百度图库搜的): 步骤2: 根据效果图或者模型构建贝塞尔曲线,为了方便查看效果,可以设置控制点, ...
- WPF 动态绑定listview的列内容
Binding binding = new Binding(); binding.Path = new PropertyPath("State"); listViewState.D ...