并发
Miracle42
这个作者很懒,什么都没留下…
展开
-
Java并发学习笔记(十):线程安全集合类、ConcurrentHashMap原理、LinkedBlockingQueue 原理、CopyOnWriteArrayList
JUC七、线程安全集合类概述线程安全集合类可以分为三大类:遗留的线程安全集合如 Hashtable , Vector(直接用synchronized修饰方法,效率低)使用 Collections 装饰的线程安全集合(装饰器模式,使用synchronized修饰方法),如:Collections.synchronizedCollectionCollections.synchronizedListCollections.synchronizedMapCollections.synch原创 2020-06-05 22:59:01 · 1311 阅读 · 0 评论 -
Java并发学习笔记(九):Semaphore、CountdownLatch、CyclicBarrier
JUC四、Semaphore1、基本使用信号量,用来限制能同时访问共享资源的线程上限。public static void main(String[] args) { //创建Semaphore 对象,参数用户限定共享变量的个数 Semaphore semaphore = new Semaphore(3); //10线程同时运行 for (int i = 0; i < 10; i++) { new Thread(()->{原创 2020-06-05 10:34:51 · 934 阅读 · 0 评论 -
Java并发学习笔记(八):AQS(AbstractQueuedSynchronizer)、ReentrantLock 原理、读写锁使用和原理
J.U.C一、AQS 原理1、概述AQS 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架特点:用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取 锁和释放锁getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - cas 机制设置 state 状态独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问原创 2020-06-03 23:50:44 · 1141 阅读 · 0 评论 -
Java并发学习笔记(七):线程池、自定义线程池、任务调度线程池、Tomcat线程池、Fork/Join
并发工具一、线程池线程池是指管理一组同构工作线程的线程的资源池。线程池与**工作队列(Work Queue)模切相关,工作队列中保存了所有等待知心的任务。线程池中的工作线程(Work Thread)**的任务很简单:从工作队列中获取一个任务,执行任务,然后返回线程池并等待下一个任务。使用线程池的好处是:通过重用现有的线程而不是创建新线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。当请求到达时,工作线程通常已经存在,因此不会由于等待创建工作线程而延迟任务的执行,从而提高响应性原创 2020-06-03 13:13:31 · 1877 阅读 · 0 评论 -
Java并发学习笔记(六):不可变、final、保护性拷贝、享元模式、final原理、无状态
不可变一、 日期转换的问题1、引入下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");for (int i = 0; i < 10; i++) { new Thread(() -> { try { System.out.println(sdf.parse("1951-04-21"));原创 2020-06-01 15:42:44 · 1116 阅读 · 0 评论 -
Java并发学习笔记(五):乐观锁、CAS(比较交换)使用和原理、原子整数、原子引用、原子数组、原子累加器、Unsafe
乐观锁(非阻塞)一、CAS(比较交换) 与 volatile1、引入现在需要在多线程的情况下对一个账户扣款操作,除了使用synchronized方法, 还可以使用AtomicInteger 的解决问题: private AtomicInteger balance; ... public void withdraw(Integer amount) { // 需要不断尝试,直到成功为止 while (true) { int pre原创 2020-05-31 13:51:23 · 1168 阅读 · 0 评论 -
Java并发学习笔记(四):Java内存模型(JMM)、可见性、有序性、volatile使用、volatile原理、线程安全单例、Happens-Before
Java内存模型一、简介Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节。其中所指的变量包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,因为后者是线程私有的。工作原理:Java内存模型规定了所有变量都存储在主内存(Main Memory)中,每条线程还有自己的工作内存(Work Memory,可以与高速缓存类比),现成的工作内存保存了该线程使用的变量的主内存副本,线程对变量的所有操作(读取、赋值等原创 2020-05-30 15:45:25 · 1213 阅读 · 1 评论 -
Java并发学习笔记(三):Wait\Notify、保护性暂停、生产者消费者、Park\Unpark、线程状态转换、活跃性、ReentryantLock、顺序控制
一、Wait和Notify1、原理Wait和Notify用于等待。其原理为:Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入 EntryList 重新竞争BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片BLOCKED 线程会在 Owner 线程释放锁时唤醒2、相关API原创 2020-05-29 16:05:57 · 1503 阅读 · 0 评论 -
Java并发学习笔记(二):synchronized使用、synchronized原理、Monitor管程、轻量级锁、自旋优化、偏向锁、锁消除
共享模型之管程一、引入看看下面的例子,两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗? static int counter = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new Runnable() { public void run() {原创 2020-05-28 19:55:43 · 1374 阅读 · 1 评论 -
Java并发学习笔记(一):线程和进程、线程的基本使用、线程相关方法、线程运行原理、线程的状态
简介一、进程与线程1、进程:进程是由指令和数据组成的,但这些指令要运行,数据要读写,就必须将指令加载到CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络设备。进程就是用来加载指令、管理I/O、管理内存当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就启动了一个进程进程可以视为程序的一个运行实例(程序是静态的,进程是动态的),大部分程序可以运行多个进程(浏览器、记事本等),也有的程序只运行一个进程(360等)2、线程:一个进程中可以有一到多个进程一个进程就是一段指令流,将原创 2020-05-26 23:37:59 · 1367 阅读 · 0 评论