黑马程序员技术交流社区
标题:
求助
[打印本页]
作者:
王轶
时间:
2011-9-27 10:28
标题:
求助
public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}
public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println("main======"+tt.b);
}
}
----------------------------------------
1.我想问的是两个线程会同时 一个访问M1方法,一个访问M2方法。还是别的?
2.当类中有synchronized修饰的方法时,两个线程同时访问两个方法 只能先执行一个方法吗,待这个锁解开了,才执行另一个方法,还是两个能同时访问?
最好能给我回答下,越详细越好。我不是太懂
作者:
匿名
时间:
2011-9-27 11:53
java中每一个对象对应一个唯一的锁。
new TT()时这个对象和这个对象的锁就都在内存中建立了。
synchronized修饰方法,是指这个方法必须获得调用这个方法的对象的锁才能执行。
比如上面的 tt.m2(); 就是说m2()这个方法的执行必须获得调用它的对象 tt 的锁以后才能执行。
tt.m1()也是一样的。
你在主函数中调用 t.start(),虚拟机会自动调用 tt 对象里的run()方法,因为run()方法不是同步方法,所以执行run()方法不用获得 tt 这个对象的锁。而run()方法体里面调用的 m1()方法是同步的,必须获得tt 对象的锁才能执行,如果没有锁,则线程会阻塞。同时main()方法往下执行,调用 tt.m2() 方法,m2() 方法的执行必须获得 tt 的对象锁。由于 m1()和m2()方法都要获得 tt 的对象锁后才能执行,而同一时间只能有一个线程获得对象的对象锁。所以 main()方法线程和run()里调用的m1()方法线程会发生竞争,同一时间 只能有一个线程执行,另一个线程必须等待获得 tt 对象锁的 线程执行完毕之后才会执行。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2