# multi-thread-training **Repository Path**: salierime/multi-thread-training ## Basic Information - **Project Name**: multi-thread-training - **Description**: 企业级多线程操作方法实战。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-10-05 - **Last Updated**: 2025-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1. part1basiclock模块: (1) TestLock01 --> synchronized关键字解决并发问题 (2) TestLock02 --> ReentrantLock解决并发问题。 (3) TestLock03 --> 【生产者消费者】while替代if解决虚假唤醒。 (4) TestLock04 --> 【生产者消费者】Reentrantlock替代synchronized关键字。 (5) TestLock05 --> 【生产者消费者】Reentrantlock Condition实现通知顺序访问。 (6) ReadWriteLockDemo --> 读写锁:读共享,写锁住 (7). TestLock06 --> 验证synchronized可重入锁 (8) TestLock07 --> 验证reentrantlock可重入锁 (9) TestLock08 --> 自旋锁 (10) TestLock09 --> 死锁 # 2. part2eightlock模块: (1) Lock801,Lock802 --> 被synchronized修饰的方法,锁的对象是方法的调用者。因为两个方法的调用者是同一个,所以两个方法用的是同一个锁,先调用方法的先执行,第二个方法只有在第一个方法执行完释放锁之后才能执行。 (2) Lock803 --> 新增的方法没有被synchronized修饰,不是同步方法,不受锁的影响,所以不需要等待。其他线程共用了一把锁,所以还需要等待。 (3) Lock804 --> 被synchronized修饰的方法,锁的对象是方法的调用者。因为用了两个对象调用各自的方法,所以两个方法的调用者不是同一个,所以两个方法用的不是同一个锁,后调用的方法不需要等待先调用的方法。 (4) Lock805、Lock806 --> 被synchronized和static修饰的方法,锁的对象是类的class对象。因为两个同步方法都被static修饰了,所以两个方法用的是同一个锁,后调用的方法需要等待先调用的方法。 (5) Lock807、Lock808 --> 被synchronized和static修饰的方法,锁的对象是类的class对象。仅仅被synchronized修饰的方法,锁的对象是方法的调用者。因为两个方法锁的对象不是同一个,所以两个方法用的不是同一个锁,后调用的方法不需要等待先调用的方法。 # 3. part3collection模块: (1) ListTest01 --> ArrayList,Vector,CopyOnWriteArrayList (2) MapTest01 --> HashMap,ConcurrentHashMap (3) SetTest01 --> HashSet,CopyOnWirteArraySet (4) UnsafeList --> 锁List并不能实现线程安全 # 4. part4createthread模块: (1) CreateThreadDemo01 --> 继承Thread类,重写run方法,调用start开启线程 (2) CreateThreadDemo02 --> 实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法 (3) CreateThreadDemo03 --> 实现Callable接口,重现call()方法创建线程 (4) CreateThreadSummary --> 三种实现方式总结 (5) DaemonThread01 --> 守护线程 (6) ProxyThreadDemo01 --> 代理线程 (7) ThreadPriorityDemo01 --> 线程勉强实现优先级 (8) ThreadStateDemo01 --> 线程工作状态 # 5. part5assistclass模块: (1) CountDownLatchTests01、CountDownLatchTest02 --> CountDownLatch用法 (2) CyclicBarrierTest01 --> CyclicBarrier用法 (3) SemaphoreTest01 --> Semaphore用法 # 6. part6blockingque模块: (1) ArrayBlockingQueueTest01、ArrayBlockingQueueTest02、ArrayBlockingQueueTest03 --> ArrayBlockingQueue用法 (2) SynchronousQueueTest01 --> SynchronousQueue用法 # 7. part7threadpool模块: (1) ThreadPoolTest01 --> Executors.newFixedThreadPool(int) (2) ThreadPoolTest02 --> Executors.newSingleThreadExecutor() (3) ThreadPoolTest03 --> Executors.newCachedThreadPool() (4) ThreadPoolTest04 --> 自定义线程池 -- abort拒绝策略->队列满了抛异常 (5) ThreadPoolTest05 --> 自定义线程池 -- callerRuns拒绝策略->哪来的回哪去 (6) ThreadPoolTest06 --> 自定义线程池 -- dicard拒绝策略->队列满了丢掉任务,不会抛出异常 (7) ThreadPoolTest07 --> 自定义线程池 -- dicardoldestPolicy拒绝策略->队列满了,尝试去和最早的竞争,也不会抛出异常 (8) ThreadPoolTest08 --> Executors.newScheduledThreadPool(1) # 8. part8forkjoin模块: (1) ForkJoinWork、ForkJoinWorkDemo --> ForkJoin用法 # 9. part9future模块: (2) CompletableFutureDemo --> Future用法 # 10. part10volatile模块: (1) VolatileTest01 --> 验证volatile可见性 (2) VolatileTest02 --> 验证volatile不具备原子性 (3) VolatileTest03 --> 验证volatile +AtomicInteger保证可见性、原子性 # 11 part11singleton模块: (1) Singleton01 --> 饿汉 (2) Singleton02 --> 懒汉(线程不安全) (3) Singleton03 --> 懒汉(线程安全) (4) Singleton04 --> 懒汉(线程安全,避免指令重排) (5) Singleton05 --> 懒汉(线程安全,避免指令重排) (6) Singleton06 --> 懒汉(线程安全,避免指令重排,部分避免反射破坏) (7) Singleton07 --> 懒汉(线程安全,避免指令重排,部分避免反射破坏) (8) Singleton08 --> 枚举实现单例(推荐) # 12. part12cas模块: (1) CASDemo01 --> 原子类 => UnSafe => CAS 底层思想 (2) CASDemo02 --> AtomicReference使用 (3) CASDemo03 --> ABA问题,解决ABA问题 (4) UnsafeBank # 13. part13function模块 (1) Test01 --> 函数型接口:有一个输入,一个输出 (2) Test02 --> 断定型接口:有一个输入,返回值只能是布尔值 (3) Test03 --> Consumer消费型接口:只有输入没有返回值 (4) Test04 --> 供给型接口:没有参数,只有返回值 # 14. part14threadcommunication模块 (1) TestPC --> 测试生产消费模型-->利用缓冲区解决-->管程法 (2) TestPC2 --> 测试生产者消费者问题2-->信号灯法 # 15.part15exceptionhandle模块 (1) Test01 --> 重写ThreadPoolExecutor.afterExecute方法,处理传递的异常引用 (2) Test02 --> 实例化,传入自己的ThreadFactory,设置Thread.UncaughtExceptionHandler处理未检测的异常 # 16. asyn-collection工程 ## 16.1. 异步执行方法: (1) new SendMsgThread(userId).start(); (2) new Thread(sendMsgRunnable).start(); (3) Future submit1 = executorService.submit(() -> { log.info("赠送积分成功,用户是:{}", userId); return "xixi"; }); 注:可阻塞获取返回值 (4) CompletableFuture submit1 = CompletableFuture.supplyAsync(() -> { log.info("赠送积分成功,用户是:{}", userId); return true; }); 注:可阻塞获取返回值 (5) @Async注解 注:可自定义线程池 (6) listener机制 注:实现了不同线程高内聚低耦合 (7) google guava包 注:实现了监听线程异常 ## 16.2. 请求合并: (1) CompletableFuture userInfo = CompletableFuture.supplyAsync(() -> { log.info("1"); return SysUserDTO.builder().uuid("1").username("sali-1").build(); }); (2) Future userInfo = executorService.submit(() -> { log.info("1"); return SysUserDTO.builder().uuid("1").username("sali-1").build(); });