博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程-53-ReentrantLock类-互斥锁
阅读量:4302 次
发布时间:2019-05-27

本文共 2282 字,大约阅读时间需要 7 分钟。

前面文章末尾,我们提到wait会释放锁,而sleep不会释放锁。那么什么是锁,锁就是把线程锁住。也就是线程能被锁住,当然还有释放锁。这篇来了解下ReentrantLock类,中文的意思就是互斥锁。主要学习这个类的lock()获取锁和unlock()释放锁。

互斥锁代码举例

我们先来看代码,然后来解释。

package thread;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class ReentrantLock_Demo {	public static void main(String[] args) {		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 int flag = 1;	private ReentrantLock r = new ReentrantLock(); 	private Condition c1 = r.newCondition();	private Condition c2 = r.newCondition();	private Condition c3 = r.newCondition();	public void print1() throws InterruptedException {		r.lock();			if(flag != 1) {				c1.await();      // C1进入等待状态			}			System.out.print("跟");			System.out.print("我");			System.out.print("一");			System.out.print("起");			System.out.println("念");			flag = 2;			c2.signal();        // c1等待 唤醒c2		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("路");			System.out.print("一");			System.out.println("条");			flag = 3;			c3.signal(); 			// c2等待,唤醒c3 		r.unlock();	}		public void print3() throws InterruptedException {		r.lock();			if(flag != 3) {				c3.await();			}			System.out.print("信");			System.out.print("才");			System.out.print("怪");			System.out.println("呢");			flag = 1;			c1.signal();            // c3等待,唤醒c1		r.unlock();	}}

运行结果和前面使用同步锁是一样的。第一点不同,由前面while语句改成了if语句判断。第二个不同,由互斥锁对象r调用lock和unlock方法来替代原来的synchronized。第三点不同,三个线程之间,唤醒都是很明确的,线程1等待唤醒的是线程2,线程2等待唤醒线程3,线程3等待唤醒的线程1. 这里使用了互斥锁的成员方法newCondition(),里面Condition类有await()方法就是相当于前面学习的wait方法,signal()方法就是前面的notify()方法。互斥锁比前面的同步代码块功能要强大很多。

 

转载地址:http://izows.baihongyu.com/

你可能感兴趣的文章
<h:panelgroup>相当于span元素
查看>>
java中append()的方法
查看>>
必学高级SQL语句
查看>>
经典SQL语句大全
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
log日志记录是什么
查看>>
<rich:modelPanel>标签的使用
查看>>
<h:commandLink>和<h:inputLink>的区别
查看>>
<a4j:keeyAlive>的英文介绍
查看>>
关于list对象的转化问题
查看>>
VOPO对象介绍
查看>>
suse创建的虚拟机,修改ip地址
查看>>
linux的挂载的问题,重启后就挂载就没有了
查看>>
docker原始镜像启动容器并创建Apache服务器实现反向代理
查看>>
docker容器秒死的解决办法
查看>>
管理网&业务网的一些笔记
查看>>
openstack报错解决一
查看>>
openstack报错解决二
查看>>
linux source命令
查看>>
openstack报错解决三
查看>>