刚开始学习java 敲程序时的一个小失误发现该死锁程序的一个疑问 注释的两行是我误打的 缺了static修饰对象就不会产生死锁 求高手解答为什么~~~~ 代码如下
public class TestDeadLock implements Runnable
{
public int flag = 1;
// Object o1 = new Object();
// Object o2 = new Object();
static Object o1 = new Object();
static Object o2 = new Object();
public void run() {
System.out.println("flag:" + flag);
if(flag == 1) {
synchronized(o1) {
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1");
}
}
}
if(flag ==0) {
synchronized(o2) {
try
{
Thread.sleep(500);
}
catch (InterruptedException a)
{
a.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
} public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}
public class TestDeadLock implements Runnable
{
public int flag = 1;
// Object o1 = new Object();
// Object o2 = new Object();
static Object o1 = new Object();
static Object o2 = new Object();
public void run() {
System.out.println("flag:" + flag);
if(flag == 1) {
synchronized(o1) {
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1");
}
}
}
if(flag ==0) {
synchronized(o2) {
try
{
Thread.sleep(500);
}
catch (InterruptedException a)
{
a.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
} public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}
解决方案 »
- equals方法和“==”的用法
- jsp网页怎么还有这等怪事
- 谁知到 StringReader这个类的作用啊?
- 一个窗体中有TextField和Button,TextField是不可编辑的,我想达到这样一个效果:当我点Button时,让TextField可编辑并且获取到焦点,也
- 如何在j2sdk SE v1.4.2下配置Servlet?
- 求教:statement语句不会执行,也没捕捉到任何异常信息?
- 百思不得其解
- 很菜的java基础问题
- JAVA中有没有语音文本朗读的控件!!!
- 小菜鸟求问 Set<>和Iterator<>里面的值到底起的是什么作用?是表示Set遍历的规则吗,求教
- JFileChooser如何能够根据filter根据不同文件后缀自动更改文件名
- 请问,for循环对this进行迭代是什么意思
你加个锁一点意义都没有
是静态的无论怎么new都只有那一个这个道理吧?我貌似明白点了 嘿嘿
instance synchronized method:需要得到这个instance object的锁。不同的instance有不同的锁。
而类的锁和intance的锁并没有任何关系,也就是说,调用一个类的static synchronized method并不会block住instance synchronized method的调用,反之亦然。
你这个锁相当于加在 Object 这个 类型的 类变量上 ,你找本java 编程思想 写的很详细了 ~