package com.hencoder.a17_thread_interaction;
/**
* 读写锁。
* ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
* Lock readLock = lock.readLock();
* Lock writeLock = lock.writeLock();
*
*/
public class WaitDemo implements TestDemo {
private String sharedString;
private int x=0;
private int y=0;
/**
* synchronized 关键字是锁定当前的对象。
* 被synchronized包括的代码块将会是一个原子性的操作,中间不会被打断
*/
public synchronized void add(){
//x++ 在cpu中是分为以下两个步骤来执行的
//int tmep = x + 1;
//x = temp;
x++;
y++;
}
public void sub(){
synchronized (this){//这个 等价于 直接在方法上面加synchronized 关键字
x--;
y--;
}
}
private synchronized void initString() {
sharedString = "rengwuxian";
notifyAll();//必须写在synchronized方法里
}
private synchronized void printString() {
//wait()方法 会暂时丢掉synchronized锁。直到InterruptedException或者 notify
while (sharedString == null) {//要用while因为 Thread.interrupted()也会唤醒wait();
try {
wait();//必须写在synchronized方法里,因为wait要释放锁
} catch (InterruptedException e) {//如果线程被调用了Thread.interrupted()方法 则会抛出这个异常
e.printStackTrace();
}
}
System.out.println("String: " + sharedString);
}
@Override
public void runTest() {
final Thread thread1 = new Thread() {
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
printString();
}
};
thread1.start();
Thread thread2 = new Thread() {
@Override
public void run() {
try {
thread1.join();//join方法会等待thread1运行完毕,才继续执行下面的代码。
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread.yield();//暂时让出cpu,执行其他任务
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
initString();
}
};
thread2.start();
}
}
多线程知识点synchronized wait join yield
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言:在面试过程中 关于多线程编程这一块是经常问到的 为了更好的理解关于多线程编程基础特地的记录此文章把思路理清楚...
- wait、notify机制通常用于等待机制的实现,调用wait进入等待状态,需要的时候调用notify或notif...