-
synchronized void aMethod() 的迷惑,求解10
在项目中,我想用让a方法在被一个线程调用后,就不能让其他任何一个方法或者对象调用,听别人说用synchronized修饰方法就可,但我看到有人这样说:
synchronized aMethod(){}可以防止多个线程同时访问这个对象实例的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。
这段话是不是前后矛盾啊,还是我理解错了,前面说“可以防止多个线程同时访问这个对象实例的synchronized方法”,而后面又说“其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。 ”
怎么理解这段话呢,或者说我的需求是用synchronized就ok么?求解2013年8月01日 15:55
5个答案 按时间排序 按投票排序
-
LZ对锁的机制没有理解,如果加了synchronized关键字的方法是实例方法,那么锁就是加在实例上的,“其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法”是因为另一个实例有另一个锁,当然可以访问了。
2013年8月06日 11:18
-
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
-
楼上说的没有错,我在按照我的方式给你解释下,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
-
引用如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法
是这样的吗?2013年8月01日 17:42
-
首先明白一点儿,synchronized是对象锁。“可以防止多个线程同时访问这个对象实例的synchronized方法”这是说,一个对象一次只能有一个synchronized在运行;“其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。 ”请注意了,这是另一个对象实例,换句话说,现在有两个类实例,当然可以分别访问里面的synchronized方法了。
2013年8月01日 17:02
相关推荐
public static synchronized void method() { // ... } } ``` - **对象锁**:如果`synchronized`修饰非静态方法或者同步语句块中的对象引用是实例引用,那么锁定的是该实例对象。例如: ```java public ...
public synchronized void method() { // 代码块 } ``` - **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { ...
public synchronized void myMethod() { // ... } } ``` 在上面的例子中,synchronized 关键字被用于 myMethod 方法上,以防止多个线程同时访问同一个对象的 myMethod 方法。 2. 类范围:synchronized 关键字也...
public synchronized void increment() { count++; } } ``` 在这个例子中,`increment()`方法被`synchronized`修饰,意味着每次只有一个线程可以调用此方法,防止了多个线程同时修改`count`导致的数据不一致...
public synchronized void method() { // 同步方法体 } ``` - 当一个线程调用此方法时,会锁定当前对象实例,其他线程如果想调用该方法必须等待当前线程释放锁。 - **静态方法**:若将`synchronized`用于静态...
public synchronized void method() { // 方法体 } ``` 2. 同步代码块:锁定对象实例,只允许一个线程访问指定的代码块。 ```java public void method() { synchronized (this) { // 代码块 } } ``` 在上述案例...
public synchronized void method() { // 方法体 } ``` 对于静态方法,可以使用`synchronized`关键字修饰类名,例如: ```java public class MyClass { public static synchronized void staticMethod() { // ...
public void method3(SomeObject so){ synchronized(so) { //….. } } 锁就是 so 这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。 当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象...
public static synchronized void method() { // ... } } ``` 在这种情况下,所有线程对`method()`的访问都会互斥,无论它们是否共享同一个对象实例。 除了锁住对象或类,`synchronized`还可以与`wait()`、`...
public synchronized void setHttpConnectionManager(HttpConnectionManager httpConnectionManager) { } public HttpClientParams getParams() { return null;} public void setParams(HttpClientParams params)...
public static synchronized void method() { // ... } } ``` 在这个例子中,`method()`就是一个类锁,多个线程同时调用此方法时,只有一个线程能执行,其他线程必须等待。 **对象锁(Instance Lock)** 对象锁...
public synchronized void method() { // 方法体 } ``` 2. **代码块同步**:锁定特定对象,只有获取到该对象锁的线程才能进入代码块。 ```java synchronized (object) { // 代码块 } ``` 这里的`object`通常是共享...
public synchronized void method() { // ... } } ``` 等价于: ```java public class MyClass { public void method() { synchronized (this) { // ... } } } ``` 在这里,`this`代表调用方法的...
- **解释**:线程`A`和线程`B`共享同一个`Thread1`实例`t1`,因此当线程`A`获取到`t1`的锁并执行`synchronized(this)`内的代码时,线程`B`将被阻塞,直到线程`A`释放锁。 2. **同步代码块与非同步代码块的访问** ...
同步方法是通过在方法声明前加上`synchronized`关键字,例如`public synchronized void method() {...}`。同步代码块则是通过`synchronized`关键字包裹一段代码,如`synchronized (object) { ... }`,这里的`object`...
public synchronized void someMethod() { // ... } ``` - **代码块同步**:使用`synchronized`关键字包围代码块,锁定对象是显式指定的,这样可以更精确地控制锁定范围。 ```java synchronized ...
- **同步方法**:在方法声明前加上`synchronized`关键字,如`public synchronized void method() {...}`。 同步方法会隐式地使用`this`作为监视器对象,或者对于静态方法,监视器对象是对应的类的Class实例。 3. ...
public synchronized void accessVal(int newVal) { value = newVal; // 其他代码 } } ``` 这里,`accessVal`方法被声明为`synchronized`。这意味着每次只有一个线程可以执行该方法。当一个线程正在执行该方法...
public synchronized void method() { // ... } ``` 这样,同一时间只能有一个线程执行该方法。 2. 代码块同步:通过指定一个对象锁,对特定代码块进行同步,语法如下: ```java synchronized (object) { // ... ...