日期:2014-05-20 浏览次数:20800 次
class Myrunnable implements Runnable{ private int ticket=5; public void run(){ for(int i=0;i<100;i++){ if(ticket>0){ try{ Thread.sleep(300); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println("ticket="+ticket--); } } } } public class Demo{ public static void main(String[] args){ MyRunnable myr=New MyRunnable(); Thread t1=New Thread(myr); Thread t2=New Thread(myr); Thread t3=New Thread(myr); t1.start(); t2.start(); t3.start(); } }
class MyRunnable implements Runnable { private int ticket=5; public void run() { for(int i=0;i<100;i++) { synchronized(this) //判断ticket前先将该对象锁住,防止当ticket=1时三个线程又同时减1将ticket变为负数 { if(ticket>0) { try { Thread.sleep(300); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println("ticket="+ticket--); } } } } } public class Demo { public static void main(String[] args) { MyRunnable myr=new MyRunnable(); Thread t1=new Thread(myr); Thread t2=new Thread(myr); Thread t3=new Thread(myr); t1.start(); t2.start(); t3.start(); } }
------解决方案--------------------
如果我建立三个Myrunnable的实例,然后传入三个线程的构造函数中,是不是就不会有资源共享了?
什么是共享资源?
在本例中,因为只有一个Myrunnable的实例,因此就只有一个private int ticket=5;也就是说3个线程会同时访问ticket这个成员变量,因此,ticket就是共享资源
如果有三个Myrunnable的实例,每一个线程一个实例,当然就不存在共享资源这个说法了,就不会发生线程安全问题了。
------解决方案--------------------
嗯,我和楼主在看同一本书。我想借机问一下,如果是多个Myrunnable接口的实例,将ticket设置为static作为共享数据可以吗?
------解决方案--------------------