当前位置: 代码迷 >> J2SE >> 依旧是synchronized修饰函数的有关问题
  详细解决方案

依旧是synchronized修饰函数的有关问题

热度:5215   发布时间:2013-02-25 00:00:00.0
依旧是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楼是正解。
  相关解决方案