0 1

synchronized void aMethod() 的迷惑,求解10

在项目中,我想用让a方法在被一个线程调用后,就不能让其他任何一个方法或者对象调用,听别人说用synchronized修饰方法就可,但我看到有人这样说:
    synchronized aMethod(){}可以防止多个线程同时访问这个对象实例的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。
    这段话是不是前后矛盾啊,还是我理解错了,前面说“可以防止多个线程同时访问这个对象实例的synchronized方法”,而后面又说“其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。 ”
    怎么理解这段话呢,或者说我的需求是用synchronized就ok么?求解
2013年8月01日 15:55

5个答案 按时间排序 按投票排序

0 0

LZ对锁的机制没有理解,如果加了synchronized关键字的方法是实例方法,那么锁就是加在实例上的,“其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法”是因为另一个实例有另一个锁,当然可以访问了。

2013年8月06日 11:18
0 0

synchronized 锁分为两种:
1.放在static方法上的synchronized 的锁 是 “Class” 的锁,且一个类只能有一把类锁(static synchronized方法共享一把锁子),所以同一时间只能一个用户抢到钥匙开锁其他用户都的等着他释放钥匙。这就是为什么当调用一个synchronized方法时其他其他synchronized方法也被锁的原因(其他用户得不到钥匙)

2.放到非静态方法上的synchronized 的锁 是 “对象” 的锁 ,因为这个锁不在class上而在对象上,所以同一类不同对象间的非静态锁是没有任何关系的。

a.同理以个对象内部还是只有一个锁 一把钥匙,谁抢到钥匙才能访问====>"
一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)"

b.因为不同对象的有不同的锁和钥匙所以===>“不同对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。 ”

synchronized:问题其实就在于看 锁在谁的身上。

2013年8月02日 13:35
0 0

楼上说的没有错,我在按照我的方式给你解释下,synchronized 是同步锁 当一个非static方法被synchronized修饰后,实际上是对这个方法所在的对象加了对象锁。例如A类的一个方法f() 有如下定义 public void synchronized f(){....}; A a = new A();当程序调用
a.f()时,那么就对a这个对象加同步对象锁。说的直白点就是锁定了a这个对象。那么如果有其他线程也需要调用a对象的f()方法必须要等待上一个调用这将这个对象锁释放,也就是f()方法执行完毕后,那么可以推断出 如果a对线有其他synchronized方法 那么其他线程也不能调用其他的synchronized方法,但是可以调用非synchronized修饰的方法。
如果一个static方法被synchronized修饰或者有如下代码块synchronized(A.class){...}
那么它锁定的是这个类,类级锁。那么如果有一个线程正在执行a对象的synchronized方法其他线程想要调用a对象的任何方法,都必须要等待该线程释放对a的锁定,其他线程在进行竞争。不知道这样解释你是否明白。

2013年8月01日 23:25
0 0

引用
如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法

是这样的吗?

2013年8月01日 17:42
0 0

首先明白一点儿,synchronized是对象锁。“可以防止多个线程同时访问这个对象实例的synchronized方法”这是说,一个对象一次只能有一个synchronized在运行;“其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。 ”请注意了,这是另一个对象实例,换句话说,现在有两个类实例,当然可以分别访问里面的synchronized方法了。

2013年8月01日 17:02

相关推荐

Global site tag (gtag.js) - Google Analytics