synchronized
java中synchronized可以修饰方法和对象,修饰方法又包括静态方法和非静态方法。
synchronized修饰方法并不是表示锁住了方法,其实还是锁对象。
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
ThreadTest t = new ThreadTest();
C c = t.new C();
ThreadA a = t.new ThreadA(c);
a.start();
Thread.sleep(5000);
ThreadB b = t.new ThreadB(c);
b.start();
}
public class ThreadA extends Thread {
private C c;
public ThreadA(C c) {
this.c = c;
}
public void run() {
c.test1();
}
}
public class ThreadB extends Thread {
private C c;
public ThreadB(C c) {
this.c = c;
}
public void run() {
while(true){
c.test2();
}
}
}
public class C {
public void test1(){
while(true){
System.out.println(1);
}
}
public synchronized void test2(){
while(true){
System.out.println(2);
}
}
}
}
运行的结果
1
1
1
1
1
1
...
由于synchronized修饰方法类似于synchronized(this)。所以一个线程访问了某个对象的synchronized修饰的方法A,另外一个线程就不能访问该对象的synchronized修饰的方法B了。 synchronized修饰静态方法和非静态方法锁住的对象还不一样。静态方法是对整个类加的锁。
对代码块加锁也注意不要用synchronized(this)。非常影响性能。