
[线程与并发]
多线程、高并发
我能在河边钓一整天的鱼
欢迎来到我的酒馆
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Synchronized锁的升级
目录 什么是锁升级 什么是Mark Word 锁升级的过程 什么是锁升级 使用Synchronized会让其他线程阻塞,这样很影响程序的总体效率。因此jdk1.6以后优化了Synchronized机制即——锁升级 锁升级的过程为:无锁=》偏向锁=》轻量级锁=》重量级锁 什么是Mark Word Mark Word用来存储对象运行时数据,用来记录对象运行时的一些参数,如:GC年龄,HashCode,锁标志,栈中的指针等 锁升级的过程 ...原创 2020-09-05 10:33:13 · 226 阅读 · 0 评论 -
ThreadLocal
目录 什么是Callable Runnable和Callable的区别 Callable执行原理 使用Callable创建线程 什么是Callable Callable位于JUC包下,是创建线程的第三种方式(前两种是创建Thread的子类、实现Runnable接口) Runnable和Callable的区别 Runnable不能返回结果,也不能抛出检查的异常,通过run()来调用 Callable可以有返回值,可以抛出异常,通过call方法调用 Call...原创 2020-06-01 08:40:14 · 311 阅读 · 0 评论 -
多线程的死锁问题
目录 什么是死锁 死锁产生的条件 解决死锁问题 什么是多线程中的死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或多个线程都在等待对方释放资源,都停止执行的情形,某一个同步块同时拥有两个以上对象的锁时,就可能发生死锁问题 举例,两个姑娘化妆,只有一个镜子和一个口红,两个人都需要。为了避免多线程的并发问题,我们上了锁,也就是同...原创 2020-04-25 16:18:01 · 173 阅读 · 0 评论 -
Java的线程池
目录 线程池的概念 线程池的使用 线程池的概念 其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作。在JDK1.5之后,内置了线程池,我们不需要再手动创建线程池了 线程池的优点 1.降低资源消耗 2.提高响应速度 3.提高线程的可管理性 线程池的使用 1.使用线程池的工厂类Executors里面提供的...原创 2020-04-02 14:38:18 · 271 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore
目录 CountDownLatch CyclicBarrier Semaphore CountDownLatch CountDownLatch是JUC中的一个减法计数器,有两个常用方法。 原理:每次有线程调用countDown()数量-1,假设计数器变为0,countDownLatch.await()就会被唤醒,继续执行 countDownLatch.countDown(); //数量-1 countDownLatch.await(); //等待计数器归零,然后再向..原创 2020-06-01 09:49:20 · 272 阅读 · 0 评论 -
Java中的锁机制——读写锁(共享锁/独占锁)
ReadWriteLock维护着一对关联的锁。读可以被多线程同时读,写只能由一个线程去写 我们经常听到的独占锁其实就是写锁:一次只能被一个线程占有;共享锁其实就是读锁:多个线程可以同时占有 我们举个例子,先来看看不加读写锁的情况 package com.lt.ReadWriteLock; import java.util.HashMap; import java.util.Map; public class ReadWriteLockDemo { public static ...原创 2020-06-01 10:21:47 · 654 阅读 · 0 评论 -
Java中的锁机制——自旋锁
目录 公平锁和非公平锁 可重入锁(递归锁) 自旋锁(spinlock) 死锁 公平锁和非公平锁 公平锁: 非常公平, 不能够插队,必须先来后到 非公平锁:非常不公平,可以插队 (默认都是非公平) public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }...原创 2020-06-03 10:51:23 · 699 阅读 · 1 评论 -
Java中的锁机制——可重入锁(递归锁)
目录 什么是可重入锁(递归锁) sychronized版 lock版 为什么可重入锁能防止死锁 什么是可重入锁(递归锁) 可重入锁也叫递归锁。它指的是同一个线程在外层获取锁之后,内层方法也会自动获取锁。lock和sychronized都是可重入锁 可重入锁最大的作用就是避免死锁 看这个小例子,method01和02都是加锁的方法,根据可重入锁的原理,线程只要获得了01的锁就能访问02,即使02也是个带锁的方法。 sychronized版 一...原创 2020-07-22 11:08:17 · 479 阅读 · 1 评论 -
Java中的锁机制——公平锁与非公平锁
我们先创建一个lock对象 public static void main(String[] args) { Lock lock = new ReentrantLock(); } 上图我们没有传入参数,它调用的默认构造方法如下,可以看到不传参默认使用了非公平锁 public ReentrantLock() { sync = new NonfairSync(); } 如果你传的参数为true public static void main(...原创 2020-07-22 10:21:43 · 198 阅读 · 2 评论 -
☆JUC中安全的并发集合类
CopyOnWriteArrayList List集合在单线程时是安全的,但多线程的情况下是不安全的。 public class ListTest { public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 0; i <= 10; i++) { new Threa...原创 2020-05-31 20:12:58 · 377 阅读 · 0 评论 -
CAS与ABA问题
目录 什么是CAS CAS的工作原理 CAS的优缺点 什么是ABA问题 什么是CAS CAS意为比较和交换。我们先举个小例子。我们在volatile中为了保证了操作的原子性,当时引入了AtomicInteger类。使用Atomic类中的方法的底层原理就CAS。 下面这个小例子,CAS在Java中的代码中比较给定值是否符合期望值,符合就更新,不符合就不更新 点进AtomicInteger源码,发现里面有unsafe。那什么是unsafe呢?unsafe是java调用C++的..原创 2020-06-03 10:24:53 · 353 阅读 · 0 评论 -
Volatile关键字
目录 什么是Volatile Volatile的特性 Volatile保证了可见性 Volatile不保证原子性 Volatile禁止了指令重排 什么是Volatile Volatile是JVM提供的一种轻量级的同步机制(Synchronized是重量级),它用来确保将变量的更新操作通知到其他线程。 在访问volatile变量时不会执行加锁操作,因此也不会执行线程阻塞操作。因此volatile是轻量级的。 volatile的读性能消耗与普通变量相同,但写操作稍慢,因为它需...原创 2020-06-02 16:21:12 · 200 阅读 · 0 评论 -
Java内存模型JMM
目录 什么是JMM JMM的作用 JMM模型的八种指令 JMM的指令规则 什么是JMM JMM:是Java Memory Model的缩写,即java内存模型 JMM的作用 JMM是一个缓存一致性协议,用于定义数据读写的规则 。 JMM定义了线程工作内存和主内存之间的抽象关系:即线程之间的共享变量存储在主内存(Main Memory),每个线程都有一个私有的本地内存(Local Memory) 此外,共享对象的可见性问题由volilate来...原创 2020-05-24 10:34:12 · 243 阅读 · 0 评论 -
阻塞队列BlockingQueue
目录 什么是阻塞队列 阻塞队列家族 阻塞队列的4种常用API 同步队列SynchronousQueue 什么是阻塞队列 队列是先进先出的。如果队列满了,新元素想进来不得不阻塞。如果队列是空的,想取出队列中的元素也不得不阻塞 阻塞队列广泛应用在线程池技术和各种消息队列中间件的底层中~ 阻塞队列家族 阻塞队列家族属于Clollection集合的成员,Queue与Set和List是平级 阻塞队列的4种常用API 第一...原创 2020-06-01 14:42:18 · 797 阅读 · 0 评论 -
什么是AQS?
目录 什么是AQS AQS的使用:ReentrantLock上锁原理 AQS的使用:锁如何做到互斥的? AQS的使用:如何释放锁 什么是AQS AQS全称"AbstractQueuedSynchronized"意为抽象队列同步器。我们在JUC中常用的ReentrantLock、CountDownLatch底层都是基于AQS来实现的加锁和释放锁等功能。AQS是Java并发包的基础。 AQS的使用:ReentrantLock上锁原理 当一个线程过来尝试用R...原创 2020-08-16 11:18:13 · 453 阅读 · 0 评论 -
什么是JUC
JUC是java.util.concurrent的简写。在jdk官方手册中可以看到juc相关的jar包有三个。 用中文概括一下,JUC的意思就是java并发编程工具包原创 2020-05-30 16:02:38 · 4450 阅读 · 0 评论 -
比较Sychronized和Lock
产生线程安全问题的原因 多线程访问了共享的数据,会产生线程安全问题原创 2020-04-02 09:33:48 · 251 阅读 · 0 评论 -
八种情况下分析Sychronized锁的执行
目录 情况1+2、两个方法锁一个对象(有无sleep) 情况3、一个对象,二个方法(一个带锁的方法,一个普通方法) 情况4、两个对象,两个同步方法 情况5+6、两个静态同步方法(一个对象/两个对象) 情况7+8、一个静态同步方法一个同步方法(一或二个对象) 总结 情况1+2、两个方法锁一个对象(有无sleep) 只要这个对象被一个方法锁住了,其他方法就不能执行,必须等这个对象释放后,才能执行。 所以两个方法锁一个对象,不论是否其中的一个方法有sleep,永远是先拿到锁的方法先执行 .原创 2020-05-31 12:41:07 · 271 阅读 · 0 评论 -
Java中的线程通信——生产者与消费者问题
目录 前言 Synchronized 虚假唤醒 Lock Condition的精准通知与唤醒线程 前言 等待与唤醒机制其实就是经典的生产者与消费者问题 我们知道,生产者要想和消费者作用在一件产品上,必须要用到锁机制。通过锁机制保证一个产品同一时间只有一个角色在执行。 下面将分别使用Synchronized和Lock锁解决生产者和消费者的问题。 Synchronized notify唤醒单个线程、notifyAll唤醒所有等待的线程。注意:wai...原创 2020-05-31 09:56:49 · 268 阅读 · 0 评论 -
Java中线程的六种状态
目录 线程的状态图 代码实现无限等待案例 唤醒方法 等待唤醒机制 线程间的通信 等待唤醒机制 代码实现等待唤醒机制 线程的状态图 新建、运行、阻塞、休眠、无限等待、死亡 休眠状态图 阻塞状态图 无限等待状态 代码实现无限等待案例 顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行。...原创 2020-04-02 11:48:51 · 193 阅读 · 0 评论 -
Java中创建线程的方式
目录 并发和并行 进程与线程 线程调度的方式 主线程、单线程 单线程程序执行原理 通过创建Thread类的子类创建多线程 多线程的随机打印原理 比较run方法和start方法的实现原理 Thread类的常用方法 通过声明Runable接口实现类的方式创建多线程 两种创建线程方法的比较 通过匿名内部类的方式创建线程 并发和并行 并发:同一时间段发生 并行...原创 2020-04-01 20:32:41 · 189 阅读 · 1 评论 -
Java中线程的概念
目录 并发和并行 进程与线程 线程调度的方式 并发和并行 并发:同一时间段发生 并行:同时发生 进程与线程 进程 进入到内存中的程序叫做进程 线程 程序运行时,会开启一条应用程序到CPU的执行路径,CPU通过这个路径执行进程,这个路径就叫做线程 多线程的好处:效率高、多个线程之间互不影响 线程调度的方式 分时调度 所有线程轮流使用CPU的使用权,平均分配每一个线程占用CPU的时间 抢占式调度 优先让优...原创 2020-07-22 10:02:05 · 222 阅读 · 1 评论