随笔分类 - JUC
摘要:排它锁 排它锁⼜称独占锁,获得了以后既能读⼜能写,其他没有获得锁的线程不能读也不能写,典型的synchronized就是排它锁 共享锁 共享锁⼜称读锁,获得了共享锁以后可以查看但⽆法修改和删除数据,其他线程也能获得共享锁,也可以查看但不能修改和删除数据 在没有读写锁之前,我们虽然保证了线程安全,但是
阅读全文
摘要:在⼤多数情况下,锁的申请都是⾮公平的,也就是说,线程1⾸先请求锁A,接着线程2也请求了锁A。那么当锁A可⽤时,是线程1可获得锁还是线程2可获得锁呢?这是不⼀定的,系统只是会从这个锁的等待队列中随机挑选⼀个,因此不能保证其公平性。这就好⽐买票不排队,⼤家都围在售票窗⼝前,售票员忙的焦头烂额,也顾及不上
阅读全文
摘要:可重⼊锁(⼜名递归锁) 是指在同⼀个线程在外层⽅法获取锁的时候,再进⼊该线程的内层⽅法会⾃动获取锁(前提,锁对象得是同⼀个对象),不会因为之前已经获取过还没释放⽽阻塞。 如果是1个有 synchronized 修饰的递归调⽤⽅法,程序第2次进⼊被⾃⼰阻塞了岂不是天⼤的笑话,出现了作茧⾃缚。所以Jav
阅读全文
摘要:今天早上做了大数据的实验 遇到的问题: 下午进行了软件案例需求分析的验收 晚上做了一会英语题 写了erp——绩效考核系统的数据字典 学了一会juc
阅读全文
摘要:整体的区别其实是有四个:1、所属类不同: sleep是线程中的方法,但是wait是Object中的方法。2、语法不同: sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。3、参数不同: sleep必须设置参数时间,wait可以不设置时间,不设置
阅读全文
摘要:CAS缺点:循环时间⻓开销很⼤ 引出来ABA问题??? 假设这样⼀种场景,当第⼀个线程执⾏CAS(V,E,U)操作。在获取到当前变量V,准备修改为新值U前,另外两个线程已连续修改了两次变量V的值,使得该值⼜恢复为旧值,这样的话,我们就⽆法 正确判断这个变量是否已被修改过,如下图: 用 AtomicS
阅读全文
摘要:⾃旋锁(spinlock):是指当⼀个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 ⾃旋锁与互斥锁⽐较类似,它们都是为了解决对某项资源的互斥使⽤。⽆论是互斥锁,还是⾃旋锁,在任何时刻,最多只能有⼀个保持者,也就说,
阅读全文
摘要:比较并且替换算法 compare and swap的缩写,中⽂翻译成⽐较并交换,实现并发算法时常⽤到的⼀种技术。它包含三个 操作数——内存位置、预期原值及更新值。 执⾏CAS操作的时候,将内存位置的值与预期原值⽐较: 如果相匹配,那么处理器会⾃动将该位置值更新为新值, 如果不匹配,处理器不做任何操作
阅读全文
摘要:悲观锁 认为⾃⼰在使⽤数据的时候⼀定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。 synchronized关键字和Lock的实现类都是悲观锁 适合写操作多的场景,先加锁可以保证写操作时数据正确。 调用方式 // 悲观锁的调⽤⽅式 public synchroniz
阅读全文
摘要:① java8引⼊的,相⽐较是⼀个⽐较新的类 ② ⾼并发下LogAdder⽐AtomicLog效率⾼,不过本质是空间换时间 ③ 竞争激烈的时候,LongAdder把不同线程对应到不同的Cell上进⾏修改,降低了冲突的概率,是多段锁的理念,提⾼了并发性 ④ LongAdder适合的场景是统计求和计数的
阅读全文
摘要:AtomicInteger ai = new AtomicInteger(1); //1.获取值 System.out.println("ai.get = "+ai.get()); //2.增加指定值并获取 System.out.println("ai.addAndGet(2) = "+ai.add
阅读全文
摘要:不可分割 ⼀个操作是不可中断的,即便是多线程的情况下也可以保证 java.util.concurrent.atomic 原⼦类的作⽤和锁类似,是为了保证并发情况下的线程安全。不过原⼦类相对于锁有⼀点的优势 粒度更细:原⼦变量可以把竞争范围缩⼩到变量级别,这是我们可以获得的最细的粒度的情况了,通常锁的
阅读全文
摘要:as-if-serial语义: 不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序结果不能被改变。 为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变结果。 happens-before原则: 程序次序规则(Program Or
阅读全文
摘要:两个特性 1.可见性 2.禁止指令重排 volatile保证不了原子性,原子性需要加锁。 package org.example.c3; /*** * 可见性 * * // 对一个变量解锁之前,必须先把此变量同步回主存中。这样解锁后,线程就可以访问到被修改后的值。 // 所以Synchronized
阅读全文
摘要:1.破坏临界资源 (临界资源破坏了 原子性 可见性 有序性) 直接不使用临界资源 2.只读 使用final,只读 不写 3.局部变量 每个线程的局部变量会存在栈帧中,会在每个线程的栈帧内存中被创建多份,因此不存在共享。 ThreadLocal ThreadLocal也就是线程本地变量。如果你创建了⼀
阅读全文
摘要:什么是线程安全: ⼤⽩话: 多线程下并发同时对共享数据进⾏读写,会造成数据混乱 = 线程不安全 当多线程并发访问临界资源时,如果破坏其原⼦性、可⻅性、有序性,可能会造成数据不⼀致。 临界资源:共享资源(同⼀对象)同时读写,⼀次仅允许⼀个线程使⽤,才可保证其正确性。 原子性:单一,不可分割的操作 可见
阅读全文
摘要:1、线程池的拒绝策略 等待队列已经排满了,再也塞不下新任务了,同时,线程池中的max线程也达到了,⽆法继续为新任务服务。这个是时候我们就需要拒绝策略机制合理的处理这个问题。 2、JDK内置的拒绝策略 AbortPolicy(默认):直接抛出RejectedExecutionException异常阻⽌
阅读全文
摘要:package org.example.test2; import java.util.concurrent.*; public class CustomeThread { public static void main(String[] args) { ExecutorService thread
阅读全文
摘要:corePoolSize:核心线程池数量 maximumPookSize:最大线程数量 keepAliveTime:非核心线程的空闲状态的存活时间 unit:时间单位 workQueue:工作队列(阻塞队列) threadFactory:线程工厂(创建线程) handler:拒绝策略
阅读全文