//使用synchronized进行同步
class Bottle
{
private final int capacity = 10;
private int curCapacity = 0;
//Object lock = new Object();
public synchronized void addWater()
{
if(curCapacity < capacity)
{
curCapacity++;
System.out.println(Thread.currentThread().getName() + ": add water..." + curCapacity);
}
else
{
System.out.println(Thread.currentThread().getName() + ": the bottle is full");
}
/* synchronized(lock)
{
if(curCapacity < capacity)
{
curCapacity++;
System.out.println(Thread.currentThread().getName() + ": add water..." + curCapacity);
}
else
{
System.out.println(Thread.currentThread().getName() + ": the bottle is full");
}
}
*/
}
public synchronized void getWater()
{
if(curCapacity > 0)
{
curCapacity--;
System.out.println(Thread.currentThread().getName() + ": get water..." + curCapacity);
}
else
{
System.out.println(Thread.currentThread().getName() + ": the bottle is empty");
}
}
}
class PersonDrinkWater implements Runnable
{
private Bottle bottle = null;
PersonDrinkWater(Bottle bottle)
{
this.bottle = bottle;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(300);
}
catch(InterruptedException e)
{
}
drink();
}
}
public void drink()
{
bottle.getWater();
}
}
class PersonAddWater implements Runnable
{
private Bottle bottle = null;
PersonAddWater(Bottle bottle)
{
this.bottle = bottle;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(600);
}
catch(InterruptedException e)
{
}
add();
}
}
public void add()
{
bottle.addWater();
}
}
class test
{
public static void main(String[] args)
{
Bottle b = new Bottle();
PersonDrinkWater drinker = new PersonDrinkWater(b);
PersonAddWater adder = new PersonAddWater(b);
PersonAddWater adder0 = new PersonAddWater(b);
Thread thread1 = new Thread(drinker);
Thread thread2 = new Thread(adder);
Thread thread3 = new Thread(adder0);
thread1.start();
thread2.start();
thread3.start();
}
}
//使用Locks进行同步
import java.util.concurrent.locks.*;
class Bottle
{
private final int capacity = 10;
private int curCapacity = 0;
Lock lock = new ReentrantLock();
public void addWater()
{
try
{
lock.lock();
if(curCapacity < capacity)
{
curCapacity++;
System.out.println(Thread.currentThread().getName() + ": add water..." + curCapacity);
}
else
{
System.out.println(Thread.currentThread().getName() + ": the bottle is full");
}
}
finally
{
lock.unlock();
}
}
public synchronized void getWater()
{
try
{
lock.lock();
if(curCapacity > 0)
{
curCapacity--;
System.out.println(Thread.currentThread().getName() + ": get water..." + curCapacity);
}
else
{
System.out.println(Thread.currentThread().getName() + ": the bottle is empty");
}
}
finally
{
lock.unlock();
}
}
}
class PersonDrinkWater implements Runnable
{
private Bottle bottle = null;
PersonDrinkWater(Bottle bottle)
{
this.bottle = bottle;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(300);
}
catch(InterruptedException e)
{
}
drink();
}
}
public void drink()
{
bottle.getWater();
}
}
class PersonAddWater implements Runnable
{
private Bottle bottle = null;
PersonAddWater(Bottle bottle)
{
this.bottle = bottle;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(600);
}
catch(InterruptedException e)
{
}
add();
}
}
public void add()
{
bottle.addWater();
}
}
class test
{
public static void main(String[] args)
{
Bottle b = new Bottle();
PersonDrinkWater drinker = new PersonDrinkWater(b);
PersonAddWater adder = new PersonAddWater(b);
PersonAddWater adder0 = new PersonAddWater(b);
Thread thread1 = new Thread(drinker);
Thread thread2 = new Thread(adder);
Thread thread3 = new Thread(adder0);
thread1.start();
thread2.start();
thread3.start();
}
}