作为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的应用相关推荐

  1. Java多线程之Lock接口

    为什么80%的码农都做不了架构师?>>>    Lock接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多 ...

  2. lock 线程 java_JAVA多线程-基础Lock Condition 并发集合

    跟上一篇文章比较,这次改进了之前的代码,使用了Lock Condition 和并发集合.代码量减了一些,并且更加容易读了. 这篇代码是上一篇的改进版,逻辑在前篇有说明,以防大家看不到,我再重现贴一遍. ...

  3. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  4. (JAVA)线程之lock和死锁(例)

    package thread; import java.util.concurrent.locks.*;/*** @author Alina* @date 2021年12月20日 11:07 下午* ...

  5. java 线程定时器_Java线程之Timer定时器

    定时/计划功能主要使用的就是Timer对象,它在内部还是使用多线程的方式进行处理,所以它和线程技术还是有非常大的关联. Timer类主要作用就是设置计划任务,但封装任务的类却是TimerTask类.T ...

  6. countanddown java_Java多线程之CountDownLatch

    背景 在java.util.concurrent包中,有一个CountDownLatch的多线程同步器.含义参考javadoc的说明如下: "A synchronization aid th ...

  7. android handlerthread 线程管理,Android线程之HandlerThread

    概述 HandlerThread是Thread的一个子类,是Android中提供的另一种线程形态. Handy class for starting a new thread that has a l ...

  8. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  9. java多线程之synchronized与lock、wait与notify

    一.synchronized与lock synchronized在java很早的版本就已经有了,它的作用只要是同步代码,解决线程的安全问题,但是随着java的发展,以及开发业务的不断提高,synchr ...

最新文章

  1. 线性判别分析LDA的数学原理(一)
  2. LeetCode刷题知识总结
  3. 【CodeForces - 215C 】Crosses (思维,图形题)
  4. ITIL V3 服务转换篇 之 服务转换阶段的组织形式
  5. JavaScript中执行环境和栈
  6. 将json转为map的两种方式及前后端开发json Api设计规范总结
  7. cognos report上钻下钻报表处理方法(2)
  8. MATLAB 数据显示格式
  9. 吉他音阶实战练习教程(一)
  10. 当div的宽度为百分比时,如何设置成为一个正方形?
  11. css裁剪图片 clip-path
  12. 什么是DAOstack
  13. ArcGIS点集之间两两连线
  14. mac os监听扬声器、麦克风的音量、静音
  15. 团队作业收官——项目产品宣传文案和推广方案
  16. 定时器中断控制LED闪烁(每隔1s)---普中科技开发仪
  17. python计算召回率_机器学习之分类:精确率和召回率
  18. 手机连接谷歌浏览器进行联调_如何让任何人将手机连接到您的Google Home
  19. 设置idea控制台打印的日志输出到本地文件
  20. 【爬虫练习】天气预报查询

热门文章

  1. Java打包后读文件和写文件操作方法
  2. 菜鸟学习笔记:Java提升篇4(容器4——Collections工具类、其他容器)
  3. load()是python文件操作的函数_python基础总结(函数,文件操作)
  4. Spring缓存注解@CachePut , @CacheEvict,@CacheConfig使用
  5. 使用Android手机进行开发的尝试
  6. Hibernate的CRUD重用性
  7. TCP UDP IP
  8. [转]:IOS检测网络连接状态
  9. Ajax初探(2)——Javascript
  10. 针对ArcGIS Server 跨域问题的解释