Synchronized是Java语言的关键字,可以使用它来修饰方法或者代码块,Synchronized能够保证被它修饰的方法或代码块在同一时刻最多只有一个线程执行该段代码,这里我将介绍由它来分别修饰静态方法,实例方法,以及代码块是如何使用的。
1、修饰静态方法
Synchronized修饰静态方法它的锁就是当前的class对象,那么如果当该类有多个Synchronized修饰的静态方法时,一次只有一个线程能执行其中的一个Synchronized修饰的静态方法,同时Synchronized还是可重入锁,在一个线程拿到了锁,它可以再去调用该类中其他Synchronized修饰的静态方法。
示例代码:
public class TestStaticSync {
public static void main(String[] args) {
test1();
// test2();
}
/**
* 两个线程同时抢占执行同一个方法
*/
public static void test1() {
//启用两个线程
ExecutorService executorService = Executors.newFixedThreadPool(2);
//执行加法
executorService.execute(() -> {
TestStaticSync.add(1, 1);
});
//在执行加法
executorService.execute(() -> {
TestStaticSync.add(2, 2);
});
executorService.shutdown();
}
/**
* synchronized 的可重入演示
*/
public static void test2() {
//启用两个线程
ExecutorService executorService = Executors.newFixedThreadPool(2);
//执行加法 在执行减法
executorService.execute(() -> {
TestStaticSync.add(1, 1);
TestStaticSync.sub(1, 1);
});
//执行减法 在执行加法
executorService.execute(() -> {
TestStaticSync.sub(2, 2);
TestStaticSync.add(2, 2);
});
executorService.shutdown();
}
synchronized public static void add(int a, int b)