多线程(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. [源码解析] NVIDIA HugeCTR,GPU 版本参数服务器 --(9)--- Local hash表

    [源码解析] NVIDIA HugeCTR,GPU 版本参数服务器 --(9)--- Local hash表 目录 [源码解析] NVIDIA HugeCTR,GPU 版本参数服务器 --(9)--- ...

  2. 有关base64的作业

    1.有关Base64的介绍:Base64这个术语最初是在"MIME内容传输编码规范"中提出的.Base64不是一种加密算法,虽然编码后的字符串看起来有点加密的赶脚.它实际上是一种& ...

  3. CF416E题解

    题意:对于所有的 \((u,v)\),询问有多少条边在这两个点的最短路边集之并内. 考虑对于每一个 \(u\) 建立最短路 DAG 图,问题变成询问唯一的度数为 \(0\) 的节点到所有节点路径的并集 ...

  4. ListBox 控件模板

    <Window x:Class="WpfApplication22.MainWindow" xmlns="http://schemas.microsoft.com/ ...

  5. Kubernetes 使用kubeadm创建集群

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 实践环境 CentOS-7-x86_64-DVD-1810 Docker 19.03.9 Kubernetes version: v1.20.5 ...

  6. centos 在线安装 docker

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 在新主机上首次安装Docker Engine之前,需要设置Docker存储库.之后,您可以从存储库安装和更新Docker. 设置存储库 安装yu ...

  7. 对路径“C:\inetpub\wwwroot\Test\Temper\”的访问被拒绝 【已解决】

    在IIS7上部署IIS站点时,出现如下错误: 对路径"C:\inetpub\wwwroot\Test\Temper\"的访问被拒绝: 原因是:程序对"C:\inetpub ...

  8. bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)

    bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树) bzoj Luogu 题目描述略(太长了) 题解时间 切掉一个点,连通性变化. 上圆方树. $ \sum |S| ...

  9. protocol 协议语言介绍

    Protocol Buffer是Google提供的一种数据序列化协议,是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储或 RPC 数据交换格式.它可用于通讯协议.数据存储 ...

  10. 什么是 inode ?

    一般来说,面试不会问 inode .但是 inode 是一个重要概念,是理解 Unix/Linux 文件系统和硬盘储存的基础.理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做 ...