1、synchronized关键字的作用域有二种:
1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的 synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
一道笔试题:Synchronized 修饰一个对象的某个方法时,其他线程还能调用该对象的其他方法吗?
于是写程序测试了一下:
//这是synchronized 修饰多个方法时的情况
public class SynTest {
public SynTest() {
}
public synchronized void function1() {
while(true)
System.out.println(1);
}
public synchronized void function2() {
while(true)
System.out.println(2);
}
public static void main(String[] args) {
SynTest st = new SynTest();
T t1 = new T(st, 1);
T t2 = new T(st, 2);
t1.start();
t2.start();
}
}
class T extends Thread{
private SynTest st = null;
private int i = 0;
public T(SynTest st,int i) {
this.st = st;
this.i = i;
}
public void run(){
if (i == 1)
st.function1();
else if (i == 2)
st.function2();
}
}
output:只输出1
另外将如上程序function2() 的synchronized修饰符去掉发现,output:间隔的输出1或2
于是这道题的答案有了:可以其他的执行非同步方法,不能执行其他的同步方法