都这么说“加上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)打印。结果却不是,而是轮流打印。麻烦指出。

解决方案 »

  1.   

    主线程运行的时候启动两个线程。cup 会自动分配时间给两个线程。当不是同步的时候,两条线程可能同时进入for循环。进行打印,比如线程d2可能进去for循环的时候线程d1 已经运行到for循环了。此时的i就可能不是你想要的,比如当前i为5,线程2进入的时候i替换成了 6,然后此时cpu交给线程1,则线程1打印的就是6会把5给错过去类。你可以设置数大点类。可以看出效果。。   
      

  2.   

    同步技术吧!! 你的代码是 轮流的啊,, 你加上 synchronized   就d1 打完 d2 再打啊!!!
      

  3.   

    线程简单理解就是程序执行的多条“路径”,LZ例子程序就有3条“路径”。使用synchronize关键字时会锁定当前对象,为互斥锁,它只会锁定包含在“{}”的部份,该对象的其他部分仍然可以被其他线程访问。
      

  4.   

    这样试试,注视掉同步语句再看: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();
    }
    }
      

  5.   

    楼上是对象锁,我贴一个类锁,直接按照你的demo改的
    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();
    }
    }
    两者结合体会一下比较好
      

  6.   

    比如
    线程A:计算s = a + b;
    线程B:计算m = b + a;
    如果线程AB在访问资源ab时,不加同步,有可能造成死锁...
      

  7.   

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

  8.   

    每一个对象都有一个监视器,相当于这个对象是个守卫,要想从这过去,得获取这个守卫手上唯一的一张通行证,当获得通行证过去之后,这张通行证就自动还回给了守卫,守卫就可以继续让下一个人过去!synchronized(object) { } 表示启动 object 守卫,来保护这块区域,一次只允许一个线程通过。synchronized 可以看作是 这块区域使用守卫员进行守卫
    object 可以看作是 守卫员
    object 的监视器 可以看作是 守卫手上那张唯一的通行证
    线程 可以看作是 需要从这里过去的人