![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
高并发
xsinx
这个作者很懒,什么都没留下…
展开
-
synchronized锁住的是什么?
对象锁:同步方法锁住的是对象A.一个对象+有多个synchronized方法:某一时刻内,只要有一个线程去调用其中一个synchronized 方法,其他的线程都要等待。B.一个对象中+synchronized方法+非synchronized方法:某个线程访问同步方法不影响其他线程访问非同步方法C.多个对象+多个同步方法:访问不同的对象的同步方法不会相互影响全局锁:静态同步方法锁的是当前的...原创 2019-11-27 20:51:10 · 234 阅读 · 0 评论 -
生产者消费者问题---Lock+singalAll+await
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class appliance{ private int num=0; Lock l=new ReentrantL...原创 2019-11-27 20:29:12 · 100 阅读 · 0 评论 -
生产者消费者问题---Synchronized+wait+notify
A.加锁的对象、调用wait()的对象、调用notify()的对象,这三者是一个对象B.生产者和消费者加锁的对象必须是同一个对象class shared_Resource{ private int num=0; public synchronized void decrement() { while(num==0) { ...原创 2019-11-27 15:07:21 · 116 阅读 · 0 评论 -
Synchronized 和lock的区别
A.原始构成<1>synchronized关键字属于jvm, 底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象只有在同步或方法中才能掉wait/notify等方法<2>Lock是具体类,是api层面的锁(java.util.)B.使用方法<1>sychronized不需要用户取手动释放锁,当synchroni...原创 2019-11-26 21:56:23 · 66 阅读 · 0 评论 -
虚假唤醒
A.为什么会出现虚假唤醒?虚假唤醒的出现在于生产者的notify并不在临界区内,也就是说,生产者使用临界区保护了修改流水线的这个操作,然后解锁,解锁完毕后才notify。而在这之间是非原子的。在以下情况:1).生产者对临界区加锁2).修改流水线状态3).生产者解锁4).notify通知消费者线程在3)与4)间是有空隙的,如果在3)进行后突然此刻加入了一个新的消费者,这个消费者察觉到流...原创 2019-11-26 09:30:17 · 252 阅读 · 0 评论 -
CyclicBarrier
A.什么是CyclicBarrier可循环(Cyclic)使用的屏障。让一组线程到达一个屏障(也可叫同步点)时被阻塞,知道最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CycliBarrier的await()方法B.例子先到的线程被阻塞,当线程数到3后执行主线程public static void main(String[] args) { ...原创 2019-11-25 11:11:12 · 62 阅读 · 0 评论 -
CountDownLatch
A.什么是CountDownLatchCountDownLatch主要有两个方法,当一个或多个线程调用await()方法时,调用线程会被阻塞。其他线程调用countDown()方法会将计数器减1,当计数器的值变为0时,因调用await()方法被阻塞的线程才会被唤醒,继续执行B.为什么要引入CountDownLatch由于并发有异步性,不能保证特定的线程执行顺序,现在就是为了保证特定的执行顺序...原创 2019-11-25 10:28:07 · 71 阅读 · 0 评论 -
读写锁
A.什么是读写锁?读操作共享资源,写操作独占资源B.手写一个读写锁import java.util.HashMap;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantReadWriteLock;class cache { HashMap<String, St...原创 2019-11-25 08:49:07 · 59 阅读 · 0 评论 -
ABA问题
什么是ABA问题?被换过两次,表面上还是A,其实中间换过一次举个ABA在现实生活中的例子?用代码展示ABA问题public class singleton { public static void main(String[] args) { AtomicReference num=new AtomicReference(100); new Threa...原创 2019-11-24 20:11:34 · 126 阅读 · 0 评论 -
为什么atomicIneger底层要用CAS而不是synchronized?
A.synchronized采用的是悲观锁,是一种独占锁,独占锁就意味着 其他线程只能依靠阻塞来等待线程释放锁。而在 CPU 转换线程阻塞时会引起线程上下文切换,当有很多线程竞争锁的时候,会引起 CPU 频繁的上下文切换导致效率很低B.CAS采用的是一种乐观锁的机制,它不会阻塞任何线程,所以在效率上,它会比 synchronized 要高。所谓乐观锁就是:每次不加锁而是假设没有冲突而去完成某项操...原创 2019-11-24 10:54:27 · 1116 阅读 · 1 评论 -
CAS
CAS又是怎样保证原子性的?原创 2019-11-24 10:53:36 · 99 阅读 · 0 评论 -
CAS又是怎样保证原子性的?
A.什么是CAS?<1>全称是compareAndSet,含义是比较并交换。<2>CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则返回VB.下面来看下AtomicInteger.incrementAndGet()的源码public final int incrementAndGet() { ...原创 2019-11-24 10:48:54 · 4436 阅读 · 0 评论 -
JAVA线程的6种状态
将操作系统三态模型和上面对比着学习三态链接可运行状态就是就绪态<1>观察可运行态和运行态:进入运行态的唯一方式是从可运行态进入;从运行态到可运行态有一个yield()方法,可以回忆在验证volatile的原子性中有一个判断是这样写的while(Thread.activeCount>2){ Thread.yield();}这样主线程就会再次进入到可运行态...原创 2019-11-23 22:00:18 · 120 阅读 · 0 评论 -
volatile
1.保证可见性:链接2.不保证原子性:链接3.禁止指令重排:A.重排序发生的场景:链接B.重排序解决办法:链接4.volatiled的应用场景:链接原创 2019-11-23 14:52:05 · 69 阅读 · 0 评论 -
volatile的应用场景
下面先来想一下单例模式中的双端检查public class singleton { private static singleton instance; private singleton(){} private static singleton getInstance() { if(instance==null)//(1) ...原创 2019-11-23 14:47:57 · 131 阅读 · 0 评论 -
重排序的解决方法
通过volatile标记,可以解决编译器层面的可见性与重排序问题。而内存屏障则解决了硬件层面的可见性与重排序问题A.store指令和load指令store:将cpu缓存的数据刷新到主存中load:将主存中的数据拷贝进cpuB.内存屏障的种类C.volatile写实现的内存屏障a.StoreStore屏障可以保证在volatile写之前,其前面的所有普通写操作已经对任意处理器可见了...原创 2019-11-22 20:59:22 · 317 阅读 · 0 评论 -
重排序发生的场景
A.处理器执行时的优化:a.处理器层面的“乱序”优化节省了大量等待时间,提高了处理器的性能。所谓“乱序”只是被叫做“乱序”,实际上也遵循着一定规则:只要两个指令之间不存在数据依赖,就可以对这两个指令乱序。不必关心数据依赖的精确定义,可以理解为:只要不影响程序单线程、顺序执行的结果,就可以对两个指令重排序b.乱序优化在单核时代不影响正确性;但多核时代的多线程能够在不同的核上实现真正的并行,一旦...原创 2019-11-22 20:28:29 · 227 阅读 · 0 评论 -
volatile不保证原子性
1.什么是原子性?不可分割、完整性,即某个线程正在做某个具体业务时,中间不可以被加塞或者被分割,需要整体完整,要么同时成功,要么同时失败2.写一个demo来验证volatile不保证原子性/* 大概率结果不是2000 因为i++不是一步操作,而不是一步操作,所以无法保证原子性*/class source{ volatile int id=0; public v...原创 2019-11-22 14:12:15 · 116 阅读 · 0 评论 -
ArrayList高并发相关内容
A.底层存放的是object类型B.初始值是10,hashmap的初始值是16C.ArrayList扩容是原来的一半,第一次就扩容成15,第三次扩容是22;hashMap的扩容是原值的一倍D.扩容使用的是Arrays.copyOf(int arr[],int newLength),第一个参数是旧数组,第二个参数是新数组长度E.ArrayList是线程不安全a.故障现象:写一段ArrayL...原创 2019-11-21 21:22:40 · 221 阅读 · 0 评论 -
volatile保证可见性
1.什么是可见性?当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值2.在保证可见性的过程中,线程之间的通信是什么机制?共享内存3.描述下volatile保证可见性的过程所有的变量都存放在主内存,需要时拷贝,修改完再存回主内存4.验证volatile可见性class source{ volatile int id=0; public ...原创 2019-11-21 21:17:42 · 137 阅读 · 0 评论 -
可重入锁
一.定义又名递归锁,含义是线程可以进入任何一个它已经拥有锁的所同步的代码块二.模板//获取外层方法(fun1)的锁后会自动获取内层的锁(fun2)public synchronized void fun1(){fun2();}public synchronized void fun2() {}三.synchronized 和ReentrantLock都是可重入锁1.演示synchr...原创 2019-11-20 20:35:25 · 65 阅读 · 0 评论