并发编程
凌琅Zxin
这个作者很懒,什么都没留下…
展开
-
Executor框架、ThreadPoolExecutor、3种常见的线程池
参考:https://blog.csdn.net/javazejian/article/details/508905541. Executor框架为什么需要线程池?在java中,使用线程来执行异步任务时,线程的创建和销毁需要一定的开销,如果我们为每一个任务创建一个新的线程来执行的话,那么这些线程的创建与销毁将消耗大量的计算资源。同时为每一个任务创建一个新线程来执行,这样的方式可能会...原创 2019-04-21 16:03:31 · 432 阅读 · 0 评论 -
线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )
1.线程的状态转换1.1 新建(New)创建后尚未启动1.2 可运行(Runnable)可能正在运行,也可能正在等待 CPU 时间片。包含了操作系统线程状态中的 Running 和 Ready。1.3 阻塞(Blocking)等待获取一个排它锁,如果其线程释放了锁就会结束此状态。1.4 无限期等待(Waiting)等待其它线程显式地唤醒,否则不会被分配 CP...原创 2019-04-21 16:30:51 · 1091 阅读 · 1 评论 -
中断(interrupted()、isInterrupted())、Executor的中断
1. 中断一个线程执行完毕之后会自动结束,如果在运行过程中发生异常也会提前结束。InterruptedException通过调用一个线程的 interrupt() 来中断该线程,如果该线程处于阻塞、限期等待或者无限期等待状态,那么就会抛出 InterruptedException,从而提前结束该线程。但是不能中断 I/O 阻塞和 synchronized 锁阻塞。对于以下代码,在 ...原创 2019-04-21 16:49:40 · 364 阅读 · 0 评论 -
互斥同步(synchronized、Lock、ReentrantLock、ReadWriteLock、ReentrantReadWriteLock)
互斥同步Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问:JVM 实现的 synchronized JDK 实现的 ReentrantLock1. synchronizedsynchronized关键字保证在同一时刻,只有一个线程可以执行某个对象内某一个方法或某一段代码块。重量级锁。包含两个特征:互斥性和可见性。synchronized可以解决一个线程看到对象...原创 2019-04-21 17:03:47 · 312 阅读 · 0 评论 -
AQS(CountdownLatch、CyclicBarrier、Semaphore)、FutureTask、BlockingQueue、ForkJoin
1. J.U.C - AQS (AbstractQueuedSynchronizer)java.util.concurrent(J.U.C) 大大提高了并发性能,AQS 被认为是 J.U.C 的核心。1.1CountdownLatch用来控制一个线程等待多个线程。维护了一个计数器 cnt,每次调用 countDown() 方法会让计数器的值减 1,减到 0的时候,那些因为调用 a...原创 2019-04-21 17:47:55 · 321 阅读 · 0 评论 -
线程安全的实现方法
1. 互斥同步synchronized 和 ReentrantLock。2. 非阻塞同步互斥同步最主要的问题就是线程阻塞和唤醒所带来的性能问题,因此这种同步也称为阻塞同步。互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题。无论共享数据是否真的会出现竞争,它都要进行加锁(这里讨论的是概念模型,实际上虚拟机会优化掉很大一部分不必要的加锁) 、用户...原创 2019-04-21 19:48:57 · 1251 阅读 · 0 评论 -
ThreadPoolExecutor
1. 线程池的状态在ThreadPoolExecutor中定义了一个volatile变量,另外定义了几个static final变量表示线程池的各个状态:volatile int runState;// 表示当前线程池的状态,它是一个volatile变量用来保证线程之间的可见性// 线程池状态static final int RUNNING = 0;// 当创建线程池后,初始时...原创 2019-04-26 15:50:18 · 289 阅读 · 0 评论 -
实现Java多线程
1. 实现Java多线程有三种使用线程的方法:实现 Runnable 接口; 实现 Callable 接口; 继承 Thread 类。实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。1.1 继承Thread类,重写run()方法;cl...原创 2019-04-24 14:32:00 · 198 阅读 · 0 评论 -
死锁
1.上下文切换content switch单核处理器处理多线程执行代码时,CPU通过给每个线程分配CPU时间片(一般几十毫秒)来实现这个机制。多线程不一定快:1.1 单核用多线程的情况:I/O密集型,防止独占时间过长,一个占,另一个可操作另外的部分。1.2减少上下文切换的方法无锁并发编程:避免多线程竞争锁引起的上下文切换; ID以hash算法取模分段,不同线程处...原创 2019-03-11 16:10:32 · 260 阅读 · 0 评论 -
volatile、synchronized、(原子、可见、有序)、先行发生原则
Java代码---编译--->Java字节码---类加载器加载到JVM中--->汇编指令(在CPU上执行)Java中的并发机制依赖于JVM的实现和CPU指令1.volatile轻量级synchronized,使用成本低,不会引起上下文切换和调度。1.1 主要使用的场合是在多个线程之间感知实例变量的修改,并且可以获得最新值使用,当线程想要访问volatile修饰的变量...原创 2019-03-11 16:49:27 · 310 阅读 · 0 评论 -
对象头、锁的四种状态、Java和处理器实现原子操作的方式(CAS、锁机制;总线锁定、缓存锁定)
1.对象头Java对象头里的Mark Word里默认存储对象的HashCode、分代年龄和锁标记位。32位JVM的Mark Word的默认存储结构如下图所示:在运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化。Mark Word可能变化为存储以下4种数据,如下图所示:在64位虚拟机下,Mark Word是64bit大小的,其存储结构如下图所示:2.锁...原创 2019-03-11 19:45:31 · 1234 阅读 · 0 评论 -
volatile
1.特性理解时,把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。class VolatileFeaturesExample { volatile long vl = 0L; // 使用volatile声明64位的long型变量 public void set(long l) { vl = l; // 单个volatil...原创 2019-03-20 16:12:43 · 144 阅读 · 0 评论 -
线程调度、公平锁和非公平锁、乐观锁和悲观锁、锁优化、重入锁
1. 线程调度线程调度指的就是给线程分配使用处理器的过程。主要的调度方式有两种:协同式调度和抢占式调度。1.1 协同式调度线程完成自己的任务之后主动通知系统切换到另一个线程上。优点:实现简单,线程对于自己的切换是已知的,不存在线程同步的问题;缺点:如果一个线程一直阻塞占用处理器,则其他线程都会被阻塞。1.2 抢占式调度由系统来为线程分配使用处理器的时间片。优...原创 2019-03-16 15:03:24 · 596 阅读 · 0 评论 -
线程安全、守护线程、join()
1. 线程安全多个线程在访问同一个对象的时候不需要其他额外的同步手段或措施就能保证该对象被正确的访问并产生正确的执行结果。那么这个对象就是线程安全的。线程安全的代码必须具备一个特征:代码本身封装了所有必要的正确性保障手段(如互斥同步),使用该代码的开发人员无需关心多线程的问题也不用自己采用任何措施来保证多线程的正确调用。线程不安全的代码在多个线程中使用时必须作同步处理,否则可能产生不可...原创 2019-03-16 17:52:33 · 302 阅读 · 0 评论 -
Java内存模型、volatile、原子性、可见性、有序性、happens-before原则
目录1.硬件的效率与一致性:缓存一致性(Cache Coherence)2.Java内存模型2.1主内存与工作内存2.2内存间的交互2.3 volatile型变量的特殊规则2.3.1 保证此变量对所有线程的可见性;2.3.2 禁止指令重排序优化2.3.4 在volatile与锁之中选择的唯一依据2.3.4 JMM中对volatile变量定义的特殊规则2....原创 2019-03-10 20:27:07 · 294 阅读 · 0 评论 -
Executors
1.概述初学Java多线程,常使用Thread与Runnable创建、启动线程。如下例:Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); }});t...原创 2019-03-17 15:32:24 · 171 阅读 · 0 评论 -
Java实现线程同步的方式
1. synchronized关键字synchronized关键字保证在同一时刻,只有一个线程可以执行某个对象内某一个方法或某一段代码块。重量级锁。包含两个特征:互斥性和可见性。synchronized可以解决一个线程看到对象处于不一致的状态,可以保证进入同步方法或者同步代码块的每个线程都可以看到由同一个锁保护之前所有的修改效果。实现同步的基础:Java中每个对象都可作为锁。...原创 2019-05-13 21:49:01 · 235 阅读 · 0 评论