synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。
public class Test {
Object object = new Object();
public synchronized void a() {
}
public synchronized void b() throws InterruptedException {
Thread.sleep(10000);
}
public void c() {
synchronized (object) {
}
}
public void d() {
}
}
public class Test2 {
public static void main(String[] args) throws InterruptedException {
final Test test = new Test();
while (true) {
Thread.sleep(1000);
new Thread(new Runnable() {
@Override
public void run() {
test.a();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
test.b();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
test.c();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
test.d();
}
}).start();
}
}
}
执行结果:
领取专属 10元无门槛券
私享最新 技术干货