package thread; /** * 多线程并发安全问题 synchronized * 当多个线程并发访问统一资源时,由于线程切换实际的 * 不确定性会导致操作顺序违背代码设计的执行流程而出现混乱 * 严重时可能导致系统瘫痪 * * @author 清风已来 * */ public class synDemo1 { public static void main(String[] args) { final Table table =new Table(); Thread t1 =new Thread() { public void run() { while(true) { int bean =table.getBean(); Thread.yield(); System.out.println(getName()+":"+bean); } } }; Thread t2 =new Thread() { public void run() { while(true) { int bean =table.getBean(); Thread.yield(); System.out.println(getName()+":"+bean); } } }; t1.start(); t2.start(); } } class Table{ private int beans =20; /* * 当一个方法被synchronized修饰后,该方法称为同步方法,即: * 多个线程不能同时在方法内部执行 * */ public synchronized int getBean() { if(beans==0) { throw new RuntimeException("没有豆子了"); } Thread.yield(); return beans--; } }