日期:2014-05-20  浏览次数:20893 次

依旧是synchronized修饰函数的问题
都这么说“加上synchronized关键字修饰的函数,在同一时刻内只能允许一个线程执行被synchronized修饰的函数,必须要等到这个线程执行完毕后,才允许其他线程执行…………
  看了很多例子,还是不明白,有没有一个反例,就是如果不使用synchronized修饰了,结果会有什么不同。
  这个是我举的例子:

public class Demo extends Thread
{
  public void run()
  {
for (int i = 0; i < 10; i++)
System.out.print(i + " ");
  }
  public static void main(String[] args) 
  {
Demo D1 = new Demo();
Demo D2 = new Demo();
D1.start();
D2.start();
  }
}
  按照我的理解,应该先让D1(或D2)从1打印到9,然后再让D2(或D1)打印。结果却不是,而是轮流打印。麻烦指出。

------解决方案--------------------
这样试试,注视掉同步语句再看:
Java code

public class Demo extends Thread
{
    public void run()
    {
        synchronized(this)
        {
            System.out.println(" "+Thread.currentThread().getName());
            for (int i = 0; i < 10; i++)
            {
                System.out.print(i + " ");
            }
            System.out.println();
        }
    }
    public static void main(String[] args)
    {
        Demo D1 = new Demo();
        new Thread(D1).start();
        new Thread(D1).start();
        //Demo D2 = new Demo();
        //D1.start();
        //D2.start();
    }
}

------解决方案--------------------
楼上是对象锁,我贴一个类锁,直接按照你的demo改的
Java code
public class Demo extends Thread {
    public void run() {
        synchronized (Demo.class) {
            for (int i = 0; i < 10; i++)
                System.out.println(this.getName() + " " + i + " ");
        }
    }

    public static void main(String[] args) {
        Demo D1 = new Demo();
        Demo D2 = new Demo();
        D1.start();
        D2.start();
    }
}

------解决方案--------------------
通俗点讲吧
1、你启动了两个线程,每个线程里面有一个for循环,出现轮流打印的原因是,cpu首先分配资源给了d1或d2,然后运行了一次输出,接着cup切换到了另个线程,又运行了一次输出,然后不断的切换
2、cpu分配时间是随即的,你把循环改大点,一定会出现各种结果,可能第一个线程循环了n次之后再切换给第二个线程。。
3、修改的方法,4楼是正解。