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