随笔分类 - Thread
摘要:
现在我们介绍避免死锁的几个常见方法。 ❑ 避免一个线程同时获取多个锁。 ❑ 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。 ❑ 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。 ❑ 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁
阅读全文

摘要:
介绍 线程池同其他池技术一样属于提高效率,减少性能开销的池化资源技术。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。 创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应
阅读全文

摘要:
🐱🐉 介绍 Semaphore 信号量,用来控制同一时间<span m+="" 2m="" regular";color:#0c0c0c;background:="" #ffc000"="">,资源可被<span microsoft="" yahei";color:#0c0c0c;backgr
阅读全文

摘要:
简介 AQS 是 Java 并发包里实现锁、同步的一个重要的基础框架。 AQS内部维护了一个等待队列,借助CAS方法实现了无阻塞算法进行更新。 AQS定义两种资源共享方式 Exclusive(独占,只有一个线程能执行,如ReentrantLock) Share(共享,多个线程可同时执行,如Semap
阅读全文

摘要:
CountDownLatch CountDownLatch 是一种通用的同步工具CountDownLatch内部的实现主要是依靠AQS的共享模式。 当一个线程把CountDownLatch初始化了一个count之后,其他的线程调用await就会阻塞住,直到其他的线程一个一个调用countDown方法
阅读全文

摘要:
Condition Condition是一种多线程通信工具,表示多线程下参与数据竞争的线程的一种状态,主要负责多线程环境下对线程的挂起和唤醒工作。 方法 // 阻塞 // 造成当前线程在接到信号或被中断之前一直处于等待状态。 void await() throws InterruptedExcept
阅读全文

摘要:
介绍 volatile 是 Java 虚拟机提供的轻量级的同步机制,它可以保证可见性(缓存一致性协议)和有序性(禁止指令重排序,也就是通过内存屏障来实现),但是不保证原子性。 JMM 介绍 JMM 是一个抽象的概念,它描述的是一种规范。这些规范定义了程序中各种变量的访问规则。 JMM 定义了线程和主
阅读全文

摘要:
介绍 ThreadLocal是一个线程变量工具类,提供了线程局部变量,就是为每一个使用该变量的线程都提供一个变量值的副本。我们可以利用ThreadLocal创建只能由同一线程读和写的变量。因此就算两个线程正在执行同一段代码,并且这段代码具有对ThreadLocal变量的引用,这两个线程也无法看到彼此
阅读全文

摘要:
1.Monitor对象 Monitor对象被称为管程或者监视器锁。 在Java中,每一个对象实例都会关联一个Monitor对象。 这个Monitor对象既可以与对象一起创建销毁,也可以在线程试图获取对象锁时自动生成。 当这个Monitor对象被线程持有后,它便处于锁定状态。Synchronized的
阅读全文
![[Thread] Synchronized](https://img2022.cnblogs.com/blog/697827/202208/697827-20220820101049856-711186958.png)
摘要:
Join 主线程join 启动线程t1,随后调用join,main线程需要等t1线程执行完毕后继续执行。 public class MainJoin { static class MyThread implements Runnable { String name; public MyThread(
阅读全文
![[Thread] 多线程顺序执行](https://img2022.cnblogs.com/blog/697827/202208/697827-20220820101420295-577704448.png)