首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

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

2012-09-27 
依旧是synchronized修饰函数的问题都这么说“加上synchronized关键字修饰的函数,在同一时刻内只能允许一个

依旧是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楼是正解。

热点排行