依旧是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)打印。结果却不是,而是轮流打印。麻烦指出。
[解决办法]
这样试试,注视掉同步语句再看:
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改的
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楼是正解。