线程同步

来源:互联网 发布:win8无法激活windows 编辑:程序博客网 时间:2024/05/24 01:28

1. synchronized是在执行当前方法过程中当前对象被锁定

2. 死锁的原理

死锁的程序

public class ThreadDeadLock implements Runnable {

 

public int flag = 1;

static Object o1 = new Object();

static Object o2 = new Object();

 

public static void main(String args[]) {

ThreadDeadLock t1 = ThreadDeadLock();

ThreadDeadLock t2 = ThreadDeadLock();

t1.flag = 1;

t2.flag = 0;

 

Thread td1 = new Thread(t1);

Thread td2 = new Thread(t2);

td1.start();

td2.start();

}

public void run() {

system.out.println("Flag :" + flag);

if(flag == 1) {

synchronized(o1) {

try {

Thread.sleep(500);

} catch(Exception e) {

e.printStatckTrace();

}

}

synchronized(o2) {

system.out.println("1");

}

}

if(flag == 0) {

synchronized(o2) {

try {

Thread.sleep(500);

} catch(Exception e) {

e.printStatckTrace();

}

}

synchronized(01) {

system.out.println("0");

}

}

}

}

3. 在给对象加锁之前,一定要仔细考虑是否对这些方法加同步,加同步效率可能变低,不加的话可能出现数据不一致,加了锁的方法,只是说明其他线程不能访问此加锁方法中的语句。但是不能保证其他线程能否进入其他方法体内。

public synchronized void m1  throws Exception {

b= 1000;

Thread.sleep(5000);

system.out.println("b = " + b);

}

public void m2() throws Exception {

Thread.sleep(2500);

b = 2000;

}

此时b的值可以通过m2方法改变

当我在m2()方法前加上synchronized的话,就不能对b的值进行改变,因为它已经别上锁,不能再上一次锁。

原创粉丝点击