关于java死锁的情况
1.看看下面的代码会发生死锁的情况吗?我的机子试了好几次也没出现死锁的情况。
class Thread_1implements Runnable
{
Object obj= new Object();
int i= 100;
public synchronized void show2()
{
if(i>0)
{
synchronized(obj)
{
System.out.println(Thread.currentThread().getName()+" "+i);
i--;
}
}
}
publicvoid run()
{
while(i>0)
{
synchronized(obj)
{
show2();
}
}
}
}
public class ThreadTest
{
public static void main(String[] args)
{
Thread_1 t = new Thread_1();
new Thread(t).start();
new Thread(t).start();
}
}
2,下面是一个绝对死锁的程序
class MyThread implements Runnable
{
OBJ o = new OBJ();
boolean flag = true;
MyThread (boolean flag)
{
this.flag = flag;
}
static int i = 100;
public void run()
{
if (flag)
{
while(i>0)
{
synchronized(OBJ.obja )
{
System.out.println(i--);
synchronized(OBJ.objb )
{
System.out.println(i--);
}
}
}
}
else
{
while(i>0)
{
synchronized(OBJ.objb )
{
System.out.println(i--);
synchronized(OBJ.obja )
{
System.out.println(i--);
}
}
}
}
}
}
class OBJ
{
//这个是锁对象的类
static Object obja = new Object();
static Object objb = new Object();
Object objc = new Object();
Object objd = new Object();
public Object getObjc()
{
return objc;
}
public Object getObjd()
{
return objd;
}
}
public class DeadLock {
public static void main(String[] args)
{
new Thread(new MyThread(true)).start();
new Thread(new MyThread(false)).start();
}
}
但是如果我把锁换成了非静态属性的,则情况又会不一样了,这是为什么呢?
如下程序。
class MyThread implements Runnable
{
OBJ o = new OBJ();
boolean flag = true;
MyThread (boolean flag)
{
this.flag = flag;
}
static int i = 100;
public void run()
{
if (flag)
{
while(i>0)
{
synchronized(o.getObjc())
{
System.out.println(i--);
synchronized(o.getObjd())
{
System.out.println(i--);
}
}
}
}
else
{
while(i>0)
{
synchronized(o.getObjd() )
{
System.out.println(i--);
synchronized(o.getObjc() )
{
System.out.println(i--);
}
}
}
}
}
}
class OBJ
{
//这个是锁对象的类
static Object obja = new Object();
static Object objb = new Object();
finalObject objc = new Object();
finalObject objd = new Object();
public Object getObjc()
{
return objc;
}
public Object getObjd()
{
return objd;
}
}
public class DeadLock {
public static void main(String[] args)
{
new Thread(new MyThread(true)).start();
new Thread(new MyThread(false)).start();
}
}
首先我想绝对的死锁应该是不存在的!分析一下这个程序! 总共是两个线程!但是只有两个锁!因为是同步的!假如:当执行第一个线程的时候!CPU获得obja,因为CPU获取那个锁是不确定的,所以死锁的状态才是不确定的!你的程序我想只有CPU执行完obja然后获得第二个线程的锁的时候才会出现死锁吧! 这种机率比较少一些!就像我的那个死锁!当执行完Thread-0:1然后CPU切到第二个线程执行Thread-1:3然后在执行的时候,就冲突了! 就死锁了!也就是说第一个线程的锁还没释放!这主要取决于CPU执行到谁!而且我在运行下面两个程序的时候! 无论OBJ的属性是静态的还是非静态的,与死锁也没多大关系!所以!呵呵!也别太纠结这个问题了! 知识CPU的切换效率问题而已!
不会 就顶下.....
版主哪去了呢?@ 百日维新 稍等,现在用不了电脑 @百日维新 过来看看 JAVA的太菜 才学。 sorry这位同学,我们老师讲线程就提一下,平时我也都是搞web方向的东西,对java细节也没怎么研究啊,
看看这篇文章吧
我觉得吧,细节这种东西没有必要钻牛角尖,以后经验多了自然会懂:lol: 恩.....,我试了一下!死锁只出现了一次! 在第二个程序中,可是以后就不出现死锁了! 而且!不知道是我看错了没有! 你说:把锁换成非静态是另一种情况! 可是你的最后两个程序是一样的啊!恩....,这是我的一个死锁的例子!你看一下! 上面也有我的注释:
public class DeathLock{
public static void main(String[] args) {
/**
首先前提条件线程 0 和线程 1 同时开启,CPU 切换到线程 0,打印输出 Thread-0:1,这时 CPU 切换到 线程 1 打
印输出 Thread-1:3, 当线程 1 继续执行内部的同步代码块的时候发现内部的同步代码块和线程 0
的外部同步代码块使用了相同的锁对象 lock1,所以线程 1 会等待 CPU 切换到线程 0 等待与之同步的代码执行完毕,
当线程 0 重新获取到 CPU 资源继续执行自身内部的同步代码块的时候发现线程 1 中的外部同步代码块和它具有同样的锁对象
lock2,所以线程 0 就会等待 CPU
切换到线程 1 等待与之同步的代码执行完毕,而这时线程 1 也在等待线程 0 的执行完毕,2 组代码相互等待,出现死锁。
*/
final Object lock1 = new Object();
final Object lock2 = new Object();
/** 线程 0 **/
new Thread() {
public void run() {
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + ":1");
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + ":2");
}
}
};
}.start();
/** 线程 1 **/
new Thread() {
public void run() {
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + ":3");
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + ":4");
}
}
};
}.start();
}
} 青玄 发表于 2014-9-22 10:24
恩.....,我试了一下!死锁只出现了一次! 在第二个程序中,可是以后就不出现死锁了! 而且!不知道是我看错 ...
嗯,你这代码确实是会出现死锁情况。按理说和我最后一个程序是相同的,可我最后一个程序用死循环运行也不见有死锁的情况发生,我也不清楚究竟的原因。你再运行我下面的两个程序对比看看吧,我用的锁的属性是不一样的。麻烦你了。 青玄 发表于 2014-9-24 09:57
首先我想绝对的死锁应该是不存在的!分析一下这个程序! 总共是两个线程!但是只有两个锁!因为是同步的! ...
我想还应该跟系统的多核心有关。好吧,以后有时间学习学习小甲鱼的操作系统的课程时,应该这问题就解决了,很感谢你的热情回答。 谢家进 发表于 2014-9-24 11:47
我想还应该跟系统的多核心有关。好吧,以后有时间学习学习小甲鱼的操作系统的课程时,应该这问题就解决了 ...
呵呵! 不用客气!:big
页:
[1]