lock 线程 java_Java多线程之Lock的应用
作为Java的另外一种同步机制,Lock与synchronized有很大的相似性,都可以实现多线程共用方法的同步和线程内代码块的同步。如果是实现共用方法同步,只需要在共用对象中生成一个Lock,并在共用方法的开始与结束处理使用Lock的lock与unlock方法。如果要实现线程内代码块同步,则可以给需要同步的线程传进同一个Lock,使用这个Lock实现多线程间的同步。
package test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
new Thread(new A(printer)).start();
new Thread(new B(printer)).start();
}
}
class Printer {
Lock lock = new ReentrantLock();
public void print(String str) {
lock.lock();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < 5; i++) {
System.out.println(str + i);
}
lock.unlock();
}
}
class A implements Runnable {
Printer printer = null;
public A(Printer printer) {
this.printer = printer;
}
public void run() {
while (true) {
printer.print("A");
}
}
}
class B implements Runnable {
Printer printer = null;
public B(Printer printer) {
this.printer = printer;
}
public void run() {
while (true) {
printer.print("B");
}
}
}
输出:
A0
A1
A2
A3
A4
A0
A1
A2
A3
A4
B0
B1
B2
B3
B4
A0
A1
A2
A3
A4
A0
A1
A2
A3
A4
package test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
static Lock lock = new ReentrantLock();
public static void main(String[] args) {
new Thread(new A(lock)).start();
new Thread(new B(lock)).start();
}
}
class A implements Runnable {
private Lock lock = null;
public A(Lock lock) {
this.lock = lock;
}
public void run() {
while (true) {
System.out.println("A还没锁呢");
lock.lock();
System.out.println("A已经锁了");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < 5; i++) {
System.out.println("A打印:" + i);
}
lock.unlock();
System.out.println("A解除锁了");
}
}
}
class B implements Runnable {
private Lock lock = null;
public B(Lock lock) {
this.lock = lock;
}
public void run() {
while (true) {
System.out.println("B还没锁呢");
lock.lock();
System.out.println("B已经锁了");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < 5; i++) {
System.out.println("B打印:" + i);
}
lock.unlock();
System.out.println("B解除锁了");
}
}
}
输出:
A还没锁呢
A已经锁了
B还没锁呢
A打印:0
A打印:1
A打印:2
A打印:3
A打印:4
B已经锁了
A解除锁了
A还没锁呢
B打印:0
B打印:1
B打印:2
B打印:3
B打印:4
B解除锁了
B还没锁呢
A已经锁了
A打印:0
A打印:1
A打印:2
A打印:3
A打印:4
A解除锁了
A还没锁呢
B已经锁了
B打印:0
B打印:1
B打印:2
B打印:3
B打印:4
lock 线程 java_Java多线程之Lock的应用相关推荐
- Java多线程之Lock接口
为什么80%的码农都做不了架构师?>>> Lock接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多 ...
- lock 线程 java_JAVA多线程-基础Lock Condition 并发集合
跟上一篇文章比较,这次改进了之前的代码,使用了Lock Condition 和并发集合.代码量减了一些,并且更加容易读了. 这篇代码是上一篇的改进版,逻辑在前篇有说明,以防大家看不到,我再重现贴一遍. ...
- linux 线程pthread_detach,linux线程之pthread_join和pthread_detach
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...
- (JAVA)线程之lock和死锁(例)
package thread; import java.util.concurrent.locks.*;/*** @author Alina* @date 2021年12月20日 11:07 下午* ...
- java 线程定时器_Java线程之Timer定时器
定时/计划功能主要使用的就是Timer对象,它在内部还是使用多线程的方式进行处理,所以它和线程技术还是有非常大的关联. Timer类主要作用就是设置计划任务,但封装任务的类却是TimerTask类.T ...
- countanddown java_Java多线程之CountDownLatch
背景 在java.util.concurrent包中,有一个CountDownLatch的多线程同步器.含义参考javadoc的说明如下: "A synchronization aid th ...
- android handlerthread 线程管理,Android线程之HandlerThread
概述 HandlerThread是Thread的一个子类,是Android中提供的另一种线程形态. Handy class for starting a new thread that has a l ...
- Java多线程之Synchronized和Lock的区别
Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...
- java多线程之synchronized与lock、wait与notify
一.synchronized与lock synchronized在java很早的版本就已经有了,它的作用只要是同步代码,解决线程的安全问题,但是随着java的发展,以及开发业务的不断提高,synchr ...
最新文章
- 线性判别分析LDA的数学原理(一)
- LeetCode刷题知识总结
- 【CodeForces - 215C 】Crosses (思维,图形题)
- ITIL V3 服务转换篇 之 服务转换阶段的组织形式
- JavaScript中执行环境和栈
- 将json转为map的两种方式及前后端开发json Api设计规范总结
- cognos report上钻下钻报表处理方法(2)
- MATLAB 数据显示格式
- 吉他音阶实战练习教程(一)
- 当div的宽度为百分比时,如何设置成为一个正方形?
- css裁剪图片 clip-path
- 什么是DAOstack
- ArcGIS点集之间两两连线
- mac os监听扬声器、麦克风的音量、静音
- 团队作业收官——项目产品宣传文案和推广方案
- 定时器中断控制LED闪烁(每隔1s)---普中科技开发仪
- python计算召回率_机器学习之分类:精确率和召回率
- 手机连接谷歌浏览器进行联调_如何让任何人将手机连接到您的Google Home
- 设置idea控制台打印的日志输出到本地文件
- 【爬虫练习】天气预报查询
热门文章
- Java打包后读文件和写文件操作方法
- 菜鸟学习笔记:Java提升篇4(容器4——Collections工具类、其他容器)
- load()是python文件操作的函数_python基础总结(函数,文件操作)
- Spring缓存注解@CachePut , @CacheEvict,@CacheConfig使用
- 使用Android手机进行开发的尝试
- Hibernate的CRUD重用性
- TCP UDP IP
- [转]:IOS检测网络连接状态
- Ajax初探(2)——Javascript
- 针对ArcGIS Server 跨域问题的解释