了解一下,一个线程中是否可以调用多个synchronized方法(包含方法,静态方法,代码块)
```java
public class SyncTest {
//获取CPU个数
private static int cpuCount = Runtime.getRuntime().availableProcessors();
private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(cpuCount, cpuCount * 2, 20,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(20000));
static {
System.out.println("我的cpu颗数: " + cpuCount);
}
//成员变量,可被多个线程 共享
private static long a = 0L;
private static long b = 0L;
private static long c = 0L;
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(10000);
SyncTest lockobj = new SyncTest();
for (int i = 0; i < 10000; i++) {
threadPool.execute(() -> {
lockobj.sync(countDownLatch);
sync2(countDownLatch);
lockobj.sync3(countDownLatch);
});
}
// 等待所有的线程执行完再打印
countDownLatch.await();
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("c=" + c);
}
/**
* 修饰生源方法,其使用的锁对应时当前类所在的实例对象(或者说当前方法的调用对象),也就是this
*
* @param countDownLatch
*/
private synchronized void sync(CountDownLatch countDownLatch) {
try {
a++;
} finally {
countDownLatch.countDown();
}
}
/**
* 修饰静态方法,使用的锁对象是当前类
*
* @param countDownLatch
*/
private synchronized static void sync2(CountDownLatch countDownLatch) {
try {
b++;
} finally {
countDownLatch.countDown();
}
}
private void sync3(CountDownLatch countDownLatch) {
try {
synchronized (countDownLatch) {
c++;
}
} finally {
countDownLatch.countDown();
}
}
}
结果:
a=3339
b=3334
c=3332
比如上面这段代码,如果三个代码在同一个线程,甚至两个代码在同一个线程,得出的结果集都不正确。