多线程(JDK1.5的新特性互斥锁)
* 1.同步
 * 使用ReentrantLock类的lock()和unlock()方法进行同步
* 2.通信
 * 使用ReentrantLock类的newCondition()方法可以获取Condition对象
 * 需要等待的时候使用Condition的await()方法, 唤醒的时候用signal()方法
 * 不同的线程使用不同的Condition, 这样就能区分唤醒的时候找哪个线程了

 
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Demo3_ReentrantLock {
 /**
  * @param args
  */
 public static void main(String[] args) {
  final Printer3 p = new Printer3();
  
  new Thread() {
   public void run() {
    while(true) {
     try {
      p.print1();
     } catch (InterruptedException e) {
      
      e.printStackTrace();
     }
    }
   }
  }.start();
  
  new Thread() {
   public void run() {
    while(true) {
     try {
      p.print2();
     } catch (InterruptedException e) {
      
      e.printStackTrace();
     }
    }
   }
  }.start();
  
  new Thread() {
   public void run() {
    while(true) {
     try {
      p.print3();
     } catch (InterruptedException e) {
      
      e.printStackTrace();
     }
    }
   }
  }.start();
 }
}
class Printer3 {
 private ReentrantLock r = new ReentrantLock();
 private Condition c1 = r.newCondition();
 private Condition c2 = r.newCondition();
 private Condition c3 = r.newCondition();
 
 private int flag = 1;
 public void print1() throws InterruptedException {       
  r.lock();        //获取锁
   if(flag != 1) {
    c1.await();
   }
   System.out.print("黑");
   System.out.print("马");
   System.out.print("程");
   System.out.print("序");
   System.out.print("员");
   System.out.print("\r\n");
   flag = 2;
   //this.notify();      //随机唤醒单个等待的线程
   c2.signal();
  r.unlock();        //释放锁
 }
 
 public void print2() throws InterruptedException {
  r.lock();
   if(flag != 2) {
    c2.await();
   }
   System.out.print("传");
   System.out.print("智");
   System.out.print("播");
   System.out.print("客");
   System.out.print("\r\n");
   flag = 3;
   //this.notify();
   c3.signal();
  r.unlock();
 }
 
 public void print3() throws InterruptedException {
  r.lock();
   if(flag != 3) {
    c3.await();
   }
   System.out.print("i");
   System.out.print("t");
   System.out.print("h");
   System.out.print("e");
   System.out.print("i");
   System.out.print("m");
   System.out.print("a");
   System.out.print("\r\n");
   flag = 1;
   c1.signal();
  r.unlock();
 }
}
 

java基础-多线程互斥锁的更多相关文章

  1. Java基础-多线程-③线程同步之synchronized

    使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程 ...

  2. Java基础-多线程-②多线程安全问题

    什么是线程的安全问题? 上一篇 Java基础-多线程-①线程的创建和启动 我们说使用实现Runnable接口的方式来创建线程,可以实现多个线程共享资源: class Dog implements Ru ...

  3. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

  4. java基础-多线程二

    java基础-多线程二 继承thread和实现Runnable的多线程每次都需要经历创建和销毁的过程,频繁的创建和销毁大大影响效率,线程池的诞生就可以很好的解决这一个问题,线程池可以充分的利用线程进行 ...

  5. 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!

    前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...

  6. Java基础--多线程的方方面面

    1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...

  7. java基础多线程之共享数据

    java基础巩固笔记5-多线程之共享数据 线程范围内共享数据 ThreadLocal类 多线程访问共享数据 几种方式 本文主要总结线程共享数据的相关知识,主要包括两方面:一是某个线程内如何共享数据,保 ...

  8. Java基础知识之锁

    Java中实现锁的方式有多种,并且锁的分类也有很多,这篇文章会从锁分类方面简单介绍各分类的锁的特点. 悲观锁和乐观锁 悲观锁:先假设别人也会对数据就行修改,所以先获得锁再进行操作.一个县城在获得锁之后 ...

  9. C++ windows 多线程 互斥锁

    #include <opencv2/core/version.hpp> #include <opencv2/calib3d/calib3d.hpp> #include < ...

随机推荐

  1. 『德不孤』Pytest框架 — 10、setUp()和tearDown()函数

    目录 1.setUp()和tearDown()函数介绍 2.setUp()和tearDown()函数作用 3.setUp()和tearDown()函数说明 4.示例 (1)方法级 (2)类级 (3)函 ...

  2. 字符集编码(四):UTF

    在前面文章<字符集编码(中):Unicode>中我们聊了 Unicode 标准并提到其有三种实现形式:UTF-16.UTF-8 和 UTF-32,本篇我们就具体聊聊这三种 UTF 是怎么实 ...

  3. springCould注解和配置以及pom依赖

    SpringCloud注解和配置以及pom依赖说明 在本文中说明了pom依赖可以支持什么功能,以及支持什么注解,引入该依赖可以在application.properties中添加什么配置. 1.Spr ...

  4. tp5 Redis缓冲的设置与清除

    控制器代码: //设置缓冲的方法 public function order() { $word = input('word');//接受搜索值 //题意:将订单数据使用redis进行缓存中,第二次读 ...

  5. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

  6. 2.3 C++STL vector容器详解

    文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...

  7. TypeScript-axios模块进行封装的操作与一些想法

    所谓封装与模块化,对我这种初学者来说,个人理解就是解耦,比如说,当我们前端一个项目使用了现在流行的模块,但是没有对其进行封装处理,包括一些相同的代码逻辑,把他们分散在各个组件当中,这样一来整个项目对于 ...

  8. DHCP协议简析

    推荐这篇文章,原理及抓包都分析的很好: **推荐这篇文章,原理及抓包都分析的很好:** https://blog.csdn.net/andy_93/article/details/78238931 简 ...

  9. 10年.NET老程序员推荐的7个开发类工具

    做.NET软件工作已经10年了,从程序员做 到高级程序员,再到技术主管,技术总监.见证了Visual Studio .NET 2003,Visul Studio 2005, Visual Studio ...

  10. js学习笔记-Java script正则表达式

    创建正则表达式 js中的正则包含在两个斜杠之间:/abc+v/ 正则中的特殊字符 \: 1.当后面不是特殊字符时表示字符边界 2.当后面是特殊字符时表示转义 ^: 1.匹配首位,例如,/^A/ 并不会 ...