文档章节

synchronized ,notify(),wait(),Thread.sleep();

申雯雯
 申雯雯
发布于 2016/04/08 12:19
字数 471
阅读 22
收藏 0

在java中当需要实现同步的时候使用synchronized(对象实例){}

synchronized(对象实例){}的作用:是获取一个对象锁

wait(),notify()只能放在 synchronized里面使用否则会报java.lang.IllegalMonitorStateException异常;

wait()作用:释放掉得到的对象锁(释放cpu资源)后面的代码不会执行了,等待唤醒后才会执行,如果当前线程休眠(阻塞)。而没有被唤醒,会一直等待。

notify()作用:通知并唤醒休眠(阻塞)的线程。此线程不一定立刻执行(如果还有别的线程跟他抢资源的话)并且当前的线程不会释放对象锁会继续执行,当执行完当前的代码以后才会去执行别的线程。


Thread.sleep()作用:主动释放cpu资源(用在一些多线程循序执行上);


如 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。这个问题用Object的wait(),notify()就可以很方便的解决。代码如下

public class Main implements Runnable {
        //需要打印的字段
	private String name;
	//上一个对象
	private Object prev;
	//当前对象
	private Object self;

	private Main(String name, Object prev, Object self) {
		this.name = name;
		this.prev = prev;
		this.self = self;
	}

	@Override
	public void run() {
	        //循环次数
		int count = 10;
		while (count > 0) {
		        //获取上一次对象的对象锁
			synchronized (prev) {
			        //获取当前对象的对象锁
				synchronized (self) {
				        //打印
					System.out.print(name);
					//重置条件
					count--;
					try {
					        //释放cpu资源
						Thread.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					//通知当前对象醒来
					self.notify();
				}
				try {
				        //上一个对象释放锁并休眠
					prev.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

		}
	}

	public static void main(String[] args) throws InterruptedException {
		
		Object a = new Object();
		Object b = new Object();
		Object c = new Object();
		Main pa = new Main("A", c, a);
		Main pb = new Main("B", a, b);
		Main pc = new Main("C", b, c);

		new Thread(pa).start();
		Thread.sleep(1);
		new Thread(pb).start();
		Thread.sleep(1);
		new Thread(pc).start();
		
	}
}




© 著作权归作者所有

申雯雯
粉丝 0
博文 20
码字总数 2575
作品 0
桂林
私信 提问
java中同步的实现(磨砺营马剑威java)

Java代码 public class MyThreadPrinter2 implements Runnable { private String name; private Object prev; private Object self; private MyThreadPrinter2(String name, Object prev, Ob......

磨砺营
2016/08/25
14
0
JAVA中wait notify sleep详解

在JAVA中,是没有类似于PV操作、进程互斥等相关的方法的。JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的互斥内存块,在JAVA中...

微wx笑
2015/01/08
0
0
java中进程同步浅谈(磨砺营马剑威java)

Java 代码public class MyThreadPrinter2 implements Runnable { } Java代码 public void run() { } Java代码 public class MyThreadPrinter2 implements Runnable { }......

磨砺营
2016/08/22
128
0
线程间的通信

线程间的通信 wait/notify 等待,通知机制的实现 wait()是Object类的方法,在调用wait()方法之前,线程必须获得该对象的对象级别锁,只能在同步中调用wait()方法 notify()也要在同步方法或者...

writeademo
2016/12/28
8
0
java wait notify的用法

java wait notify的用法  wait(),notify(),notifyAll()不属于Thread类,而是属于Object基本类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.由于都个对像都有锁,锁是每个对像的基...

木辰寿
2012/06/04
693
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
4
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
6
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
4
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
993
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部