java中synchronized锁对象的问题

来源:百度知道 编辑:UC知道 时间:2024/05/24 02:01:37
synchronized与对象加锁时,和与this关键字一起用时有什么区别;也就这样
synchronized(Object){},synchronized(this){},这两种代码块加的锁有什么不同吗?比如下面的这个程序两种情况结果完全不同:
public class Tsynchronized implements Runnable {
Integer b = 100;
//------------
public void m1() { // m1()被锁定了的方法
System.out.println("m_one:"+b);
synchronized(this){
b = 1000;
System.out.println("m_two:"+b);
}
try {
Thread.sleep(1500);
} catch (InterruptedException e) {}
System.out.println("m1:" + "b = " + b);
}
//------------
public void m2()throws Exception {
synchronized(this){
b = 2000;
Thread.sleep(1000);
}
System.out.println("m2:" + b);
}
//------------
public void run() {
m1();
}
//------------------Main Method------------------

censhi007 是对的。LZ你锁住某个对象b的话,那你只能保证在synchronized内调用b对象的方法或者属性的“那一句语句”时,别的线程(同样通过synchronized请求调用对象b)会被堵塞。

如果说要详细的说,那就是你在synchronized(b)m2里面,b = 2000这一句语句运行的那个时间内,m1里面的b = 1000这一句不能同时运行,会等待b = 2000运行完才运行。呃,很显然,在这里synchronized(b)连个毛用都没有了。。
但是如果你是调用b对象的某一个方法a()的话,那么在运行方法a的整个过程,m1不能同时运行方法a(),这样就有那么点用处了。。

而yzn6370823 说的在一定程度上也没错。你根本不能保证m1和m2哪一个synchronized块会被先调用。

同时,你在
public void m2()throws Exception {
synchronized(this){
b = 2000;
Thread.sleep(1000);
}
System.out.println("m2:" + b);
}
中,把 System.out.println("m2:" + b);放到synchronized外是不对的,因为你的意图应该是m2输入被锁住的时候的值吧,如果你RP不好,说不准m2就输出1000了。

那位匿名回答者说的挺详细了,俺再来补充一点点.其实,如果你想保证Tsynchronized这个类产生的一个实例中的方法在同一时间只能被一个线程调用的话,根本不应该用synchronized(object)这种形式,而应该用
public synchronized void method()这种形式.那么,具体一点说,它有什么用呢? 其实: 用synchronized修饰某个方法后,当一个线程进入这方法后,所有其他试图调用同一个实例(即同一个对象)中的该方法(或者任何其他同步方法)的线程必须等待. 当然,说了这么多原