Java并发学习之synchronized(二)

上一篇看了synchronized修饰代码块,修饰方法。

这一篇看下加在静态方法,以及类。

废话不多说上代码,本人学习也是边看边学。o(╥﹏╥)o


/**

* 测试类

*/

public void testSynchronizedClass() {

synchronized (SynchronizedExample2.class) {

for (int i =0; i <9; i++) {

log.info("test - 1 :{}", i);

}

}

}

/**

* 测试静态方法

*/

public static synchronized void testSynchronizedMethod() {

for (int i =0; i <9; i++) {

log.info("test - Method :{}", i);

}

}

/**

* 线程池的基本大小

*/

static int corePoolSize =10;

/**

* 线程池最大数量

*/

static int maximumPoolSizeSize =100;

/**

* 线程活动保持时间

*/

static long keepAliveTime =1;

/**

* 任务队列

*/

static ArrayBlockingQueueworkQueue =new ArrayBlockingQueue(10);

public static void main(String[] args) {

//推荐手动创建线程池

    ThreadPoolExecutorexecutor =new ThreadPoolExecutor(

corePoolSize,

maximumPoolSizeSize,

keepAliveTime,

TimeUnit.SECONDS,

workQueue,

new ThreadPoolExecutor.AbortPolicy());

SynchronizedExample2 synchronizedExample1 =new SynchronizedExample2();

SynchronizedExample2 synchronizedExample2 =new SynchronizedExample2();

executor.execute(() -> {

synchronizedExample1.testSynchronizedClass();

});

executor.execute(()->{

synchronizedExample2.testSynchronizedClass();

});

}

上测试代码输出代码  我们是两个对象同时调用一个测试类的方法。

11:16:29.765 [pool-1-thread-1] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :0

11:16:29.768 [pool-1-thread-1] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :1

11:16:29.768 [pool-1-thread-1] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :2

11:16:29.768 [pool-1-thread-1] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :3

11:16:29.768 [pool-1-thread-1] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :4

11:16:29.768 [pool-1-thread-1] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :5

11:16:29.768 [pool-1-thread-1] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :6

11:16:29.768 [pool-1-thread-1] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :7

11:16:29.768 [pool-1-thread-1] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :8

11:16:29.768 [pool-1-thread-2] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :0

11:16:29.768 [pool-1-thread-2] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :1

11:16:29.768 [pool-1-thread-2] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :2

11:16:29.768 [pool-1-thread-2] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :3

11:16:29.768 [pool-1-thread-2] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :4

11:16:29.768 [pool-1-thread-2] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :5

11:16:29.768 [pool-1-thread-2] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :6

11:16:29.768 [pool-1-thread-2] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :7

11:16:29.768 [pool-1-thread-2] INFO com.study.concurrency.example.SynchronizedExample2 - test - 1 :8

可以清晰看见 我们即使两个对象同时调用一个方法 我们也是要等待一个线程执行完 另外一个线程在执行

那么 修饰静态方法的是不是也是一样?

public static void main(String[] args) {

//推荐手动创建线程池

    ThreadPoolExecutorexecutor =new ThreadPoolExecutor(

corePoolSize,

maximumPoolSizeSize,

keepAliveTime,

TimeUnit.SECONDS,

workQueue,

new ThreadPoolExecutor.AbortPolicy());

executor.execute(() -> {

testSynchronizedMethod();

});

executor.execute(()->{

testSynchronizedMethod();

});

}

输出结果和上面输出一致 这里我就不贴出来了。 另外补充下

synchronized 是不可中断锁 适合竞争不激烈 可读性也高。

本文仅限本人小白学习参考,不足之处请大佬指正。

你可能感兴趣的:(Java并发学习之synchronized(二))