package com.example.concurrent;
/**
* Created by 程序亦非猿 on 15/10/24.
*/
public class WaitNotify {
public int money = 0;
public void buy() {
synchronized (this) {
try {
System.out.println("try to buy Thread:"+Thread.currentThread().getName());
/**
* NOTICE if的话,会出现负数
* NOTICE while的话每次都会判断 不会出现金钱为负数
* 因为if直接下去了,while再notify后还会进入条件判断
*/
// if (money <= 0) {
while (money == 0) {
System.out.println("屌丝!请先赚钱!~");
wait();
}
money = money - 100;
System.out.println("土豪!购买成功!~~还剩下:" + money+";;Thread:"+Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void earn() {
synchronized (this) {
money = 500;
/**
* 如果只notify 那么购买成功的次数机会不可能是5
屌丝!请先赚钱!~
屌丝!请先赚钱!~
屌丝!请先赚钱!~
屌丝!请先赚钱!~
屌丝!请先赚钱!~
土豪!购买成功!~~还剩下:400
*/
// notify();
/**
* notifyAll 则能购买成功五次 一定!~
* **/
notifyAll();
}
}
public static final Object lock = new Object()
;
private boolean open = false;
public int test() {
// synchronized (lock) { //这样会报错
synchronized (this) {
while (!open) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return 1;
}
public static void main(String[] args) {
final WaitNotify waitNotify = new WaitNotify();
// testWaitNotify(waitNotify);
new Thread(new Runnable() {
@Override
public void run() {
int a = waitNotify.test();
}
}).start();
}
private static void testWaitNotify(final WaitNotify waitNotify) {
for (int i = 0; i < 7; i++) {
new Thread(new Runnable() {
@Override
public void run() {
waitNotify.buy();
}
}).start();
}
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
waitNotify.earn();
}
}