日期:2014-05-20 浏览次数:20997 次
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作为共享数据可以吗?
------解决方案--------------------