请一个关于synchronized的问题

来源:百度知道 编辑:UC知道 时间:2024/09/21 17:58:02
比如有个类是这样的
public class A{
private static A instance = null;
private static List list = new ArrayList();

private A(){
}

public static A getInstance(){
if(instance == null){
instance = new A();
}
return instance;
}

public synchronized void mthod1(){
list.remove(0);
}

public void method2(){
list.add(....)
}
}

比如有2个类,第一个类调用method1方法时,第2个类能不能同时调用method2方法并修改list????
如果不能,有否其他的方法,保证method1只能有1个线程能调用,而其他线程可以调用method2方法修改list

很明显是能够调用的.

synchronized 只同步了 method1 影响不到 method2();
synchronized 只同步他所修饰的代码块.
如果你不想让同时method2执行,可以为method2 加上 synchronized .相反执行method2时也不会同时执行method1.
一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态.
如果你觉得这样满足不了你的需要,你可以查看java其它的锁(同步)机制 ReadWriteLock

首先应该理解下synchronized:
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。
也就是说当一个类调用了method1的时候,进而对list进行操作,这时候资源是被独占的,如果method1不返回,list是不会被释放的,也就是说第二个类不能同时调用method2方法并修改list。。。

关于楼主的补充问题,个人感觉没法实现,也许是自身水平的问题。。
既然楼主只想让一个线程调用method1,也就必须加上synchronized ,也就是上了锁,这个锁占用着list资源,method2只能等method1释放完成后在访问list,同时的话无法进行。如果按楼主的想法,那么加synchronized 上锁的话也没有什么意义了。

public class A {

private static A instance = null;
private static ArrayList list = new ArrayList();
static final Object obj = new Object();

private A() {
}

public sta