class DeathLockDemo1
{
public static void main(String[] args)
{
Test test1=new Test(true);
Test test2=new Test(false);
Thread th1=new Thread(test1);
Thread th2=new Thread(test2);
th1.start();
th2.start();
}
}
class MyLock
{
public static final Object A=new Object();
public static final Object B=new Object();
}
class Test implements Runnable
{
private boolean flag =false;
private static int num=0;
public Test(Boolean b)
{
this.flag=b;
}
public void run()
{
if(this.flag)
{
while(true)
{
synchronized(MyLock.A)
{
System.out.println("A true"+(++num)+"***********");
synchronized(MyLock.B)
{
System.out.println("B true"+(++num)+"***********");
}
}
}
}
else
{
while(true)
{
synchronized(MyLock.B)
{
System.out.println("B false"+(++num)+"***********");
synchronized(MyLock.A)
{
System.out.println("A false"+(++num)+"***********");
}
}
}
}
}
}
半月 发表于 2015-6-8 09:42
他只是演示死锁又不是同步
A和B不是同一个锁,不会保证只有一个线程对num进行修改 ...
存在感很差 发表于 2015-6-8 12:55
A true65***********
B false65***********
B false67***********
开弓没有回头箭 发表于 2015-6-8 14:08
这句话可以看一下两句话:
所以第一个线程执行了++num后切换到第二个线程再次++num,然后切换回去连续2次 ...
Enhon1992 发表于 2015-6-8 14:49
就是出现了连续连个1的情况
Enhon1992 发表于 2015-6-8 13:33
要是num 不是静态的话,那就不是两个线程的共享数据了 没有意义了!
mishisanyi 发表于 2015-6-9 23:29
我执行了楼主的源代码,确实出现了这样的情况,我和楼主的疑惑是一致的,难不成是输出语句分成了两句话 ...
存在感很差 发表于 2015-6-9 22:43
谁告诉你共享数据一定要用静态的,回去好好看看视频。
Enhon1992 发表于 2015-6-10 15:51
我知道你的意思 但针对我的代码 要是num不是静态的话,那么两个线程操作的num 就不是同一个num了。 ...
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |