桌子上放了一定的豆子,现在线程1,2都在抢这个桌子上的豆子,这样就会存在一种情况下,一个线程已经拿空了豆子,另一个还在继续拿,在实际生活中是不可能的,存在线程安全问题,解决方法(使用synchronized同步)
public class SyncSafe {
public static void main(String[] args) {
final Table table = new Table();
Thread t1 = new Thread(){
public void run(){
while(true){
int bean = table.getBean();
System.out.println(
getName()+":"+bean);
// Thread.yield();
}
}
};
Thread t2 = new Thread(){
public void run(){
while(true){
int bean = table.getBean();
System.out.println(
getName()+":"+bean);
// Thread.yield();
}
}
};
t1.start();
t2.start();
}
}
class Table{
//桌子上的豆子
private int beans = 20;
//获取一个豆子
public int getBean(){
synchronized(this){
if(beans == 0){
throw new RuntimeException("没了!");
}
Thread.yield();
return beans--;
}
}
}