多线程(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. php session 的使用方法

    public function insert(Request $request){ $parm = $request->except('token'); $this->validate($ ...

  2. php 代码上线

    1:php软件界面点击Tools按步骤进行即可 2:二步 3:三步 user name 为root 4:四步 5:五步

  3. composer 自动载入的四种方式

    对于第三方包的自动加载,Composer提供了四种方式的支持,分别是 PSR-0和PSR-4的自动加载,生成class-map,和直接包含files的方式. 首先引入autoload.php,在主文件 ...

  4. ubuntu 16.04和18.04 忘记登录密码的解决办法

    1:开机按Shift键,出现如下界面.(手速要快,Shift键要按时间久一点)选择第二项 2:按回车键进入如下界面,然后选中有recovery mode的选项(第三项) 3:按e进入如下界面,并找到图 ...

  5. 拓扑排序 python

    现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1.给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] , ...

  6. CTS,CLS,CLR

    1)CTS通用类型系统(Common Type System) CTS不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展.任何以.NET平台作为目标的语言必须建立它的数 ...

  7. jdbc创建数据库的连接

    package com.gylhaut.db; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Res ...

  8. 关于DP动规

    今天学了动规,简单记录一下自己理解了的:(要不俺就忘了) 首先,啥是DP??? 动态规划,其实就是组合子问题的解来解决整个问题的解,由于每个子问题他只判断一次,所以不会重复计算,那就很牛啊!!! 专业 ...

  9. office online在线预览服务与https的tls证书兼容问题

    问题现象:k8s环境配置证书后,无法调用office online 服务,附件无法预览 问题原因:ingress默认启用得是tls1.2,不兼容以下版本 k8s环境解决方法:增加ingress配置,兼 ...

  10. ldap常用命令

    单独查询用户信息 ldapsearch -D "cn=admin,dc=hrbeu,dc=edu,dc=cn" -b "ou=hbr,dc=hrbeu,dc=edu,dc ...