一个有关死锁的小问题。主函数就没写了,就是搞不懂这里的Object o1和o2为什么要用static静态修饰,
o1,o2不就是两个对象的引用吗,没见过在创建对象及引用的时候,引用前面加static修饰的,看不懂这种格式,o1,o2在这里算什么成分呢......实在不懂,向大家求助了,先谢谢了。
public class TestDeadLock implements Runnable {
public int flag = 1;
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(Exception ae){
ae.printStackTrace();
}
synchronized(o2){
System.out.println("1");
}
}
}
if(flag==0){
synchronized(o2){
try{
Thread.sleep(500);
}catch(Exception ae){
ae.printStackTrace();
}
synchronized(o1){
System.out.println("0");
}
}
}
}
o1,o2不就是两个对象的引用吗,没见过在创建对象及引用的时候,引用前面加static修饰的,看不懂这种格式,o1,o2在这里算什么成分呢......实在不懂,向大家求助了,先谢谢了。
public class TestDeadLock implements Runnable {
public int flag = 1;
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(Exception ae){
ae.printStackTrace();
}
synchronized(o2){
System.out.println("1");
}
}
}
if(flag==0){
synchronized(o2){
try{
Thread.sleep(500);
}catch(Exception ae){
ae.printStackTrace();
}
synchronized(o1){
System.out.println("0");
}
}
}
}
所有才用static修饰
需要创建多个TestDeadLock对象才能看出效果
public class TestDeadLock implements Runnable {
private int flag;
private static Object o1 = new Object();
private static Object o2 = new Object();
public TestDeadLock(int flag){
this.flag = flag;
}
public void run() {
System.out.println("flag=" + flag);
while (flag == 1) {
synchronized (o1) {
try {
Thread.sleep(500);
} catch (Exception ae) {
ae.printStackTrace();
}
synchronized (o2) {
System.out.println("1");
}
}
}
while (flag == 0) {
synchronized (o2) {
try {
Thread.sleep(500);
} catch (Exception ae) {
ae.printStackTrace();
}
synchronized (o1) {
System.out.println("0");
}
}
}
}
/**
* 测试代码
* @param args
*/
public static void main(String[] args) {
[code=java]new Thread(new TestDeadLock(0)).start();
new Thread(new TestDeadLock(1)).start();
}
}
[/code]
如果不用static修饰的话,那样测试时是达不到死锁的目的的,因为在开始线程的时候,
new Thread(new TestDeadLock(0)).start();
new Thread(new TestDeadLock(1)).start();创建了两个new TestDeadLock(0),new TestDeadLock(1),如果没有用static这两个对象中的o1和o2是相互独立的,那么在同步代码块中执行时的两把锁是毫不相关的锁,不能达到等待的效果;而用了static后,不管你创建了多少个对象,o1和o2都只有一份,所以所有线程公用o1和o2两把锁,这样就能达到等待的效果。