本帖最后由 Neutrino23 于 2012-02-15 17:03:05 编辑

解决方案 »

  1.   

    理论部分就让别人来回答吧,我来回答你举的例子
    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();
        }
    }
      

  2.   

    如果我建立三个Myrunnable的实例,然后传入三个线程的构造函数中,是不是就不会有资源共享了?什么是共享资源?在本例中,因为只有一个Myrunnable的实例,因此就只有一个private int ticket=5;也就是说3个线程会同时访问ticket这个成员变量,因此,ticket就是共享资源如果有三个Myrunnable的实例,每一个线程一个实例,当然就不存在共享资源这个说法了,就不会发生线程安全问题了。
      

  3.   

    嗯,我和楼主在看同一本书。我想借机问一下,如果是多个Myrunnable接口的实例,将ticket设置为static作为共享数据可以吗?
      

  4.   


    将ticket设置为static作为共享数据,就需要做同步,否则就会出现线程安全问题
    synchronized(Myrunnable.class){}