前言
闲暇时刻,谈一下曾经在多线程教程中接触的同步锁synchronized,相当于复习一遍吧。
主要介绍
synchronized:依赖JVM
Lock:依赖特殊的CPU指令,代码实现,ReetrantLock
主体内容
一、那么我们主要先讲解一下关于同步锁synchronized的作用范围。
1.修饰代码块:作用范围-大括号括起来的代码,作用于调用这个代码块的对象,如果不同对象调用该代码块就不会同步。
2.修饰方法:作用范围-整个方法,作用于调用这个方法的对象。
3.修饰静态方法:作用范围-整个静态方法,作用于这个类的所有对象。
4.修饰类:作用范围-synchronized后面括号括起来的部分,作用于这个类的所有对象(ps:两个线程调用同一个类的不同对象上的这种同步语句,也会进行同步)。
二、接下来,我们分别针对synchronized修饰的这四种情况写四个例子。
1.首先,写一个方法,让synchronized修饰代码块。
/** * 修饰代码块 */ public void test1(){ synchronized (this) { for(int i=0;i<10;i++){ log.info("test1-{}",i); } } } public static void main(String[] args){ SyncDecorate sd = new SyncDecorate(); ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(()->{ sd.test1(); }); executorService.execute(()->{ sd.test1(); }); }
解释:这里我们用线程池创建了两个线程分别访问test1方法中的同步代码块,第二个线程其实不等第一个线程执行完毕,就开始去访问test1方法,但test1方法中的代码块由于第一个线程的访问上了锁,所以第二个线程不得不等待第一个线程执行完这个方法。因此执行结果为如下:
23:42:39.348 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-0 23:42:39.351 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-1 23:42:39.351 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-2 23:42:39.351 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-3 23:42:39.351 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-4 23:42:39.351 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-5 23:42:39.351 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-6 23:42:39.351 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-7 23:42:39.351 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-8 23:42:39.351 [pool-1-thread-1] INFO com.controller.synchronize.SyncDecorate - test1-9 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-0 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-1 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-2 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-3 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-4 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-5 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-6 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-7 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-8 23:42:39.351 [pool-1-thread-2] INFO com.controller.synchronize.SyncDecorate - test1-9