Synchronized 关键字的理解
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
于是这道题的答案有了:可以其他的执行非同步方法,不能执行其他的同步方法