
java并发编程
ConstXiong
记录编程实践...
展开
-
java并发编程的三大问题
java并发编程的三大问题背景:计算机处理速度:CPU > 内存 > IO为了平衡三者的速度差异:CPU 增加了缓存;操作系统增加了进程、线程,以分时复用 CPU;编译程序优化指令执行次序可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性1、缓存导致的可见性问题,如cpu缓存,缓存的时差性导致数据...原创 2019-03-13 15:02:47 · 5665 阅读 · 0 评论 -
Runnable 和 Callable 有什么区别
Runnable 和 Callable 有什么区别?主要区别Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,支持泛型 Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息测试代码如下import java.util.concurrent....原创 2019-05-13 17:12:54 · 8947 阅读 · 0 评论 -
synchronized 底层实现原理?
synchronized 底层实现原理?一、作用确保线程互斥的访问同步代码 保证共享变量的修改能够及时可见 有效解决重排序问题二、用法修饰普通方法 修饰静态方法 修饰代码块三、原理同步代码块是通过 monitorenter 和monitorexit 指令获取线程的执行权 同步方法通过加ACC_SYNCHRONIZED 标识实现线程的执行权的控制测...原创 2019-05-27 10:31:08 · 13586 阅读 · 1 评论 -
ThreadLocal 是什么?有哪些使用场景?
ThreadLocal 是什么?有哪些使用场景?ThreadLocal 是线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作,不会出现...原创 2019-05-23 11:09:03 · 55006 阅读 · 9 评论 -
synchronized 和 volatile 的区别是什么?
synchronized 和 volatile 的区别是什么?作用:synchronized 表示只有一个线程可以获取作用对象的锁,执行代码,阻塞其他线程。 volatile 表示变量在 CPU 的寄存器中是不确定的,必须从主存中读取。保证多线程环境下变量的可见性;禁止指令重排序。区别:synchronized 可以作用于变量、方法、对象;volatile 只能作用于变量...原创 2019-05-28 10:50:49 · 7926 阅读 · 0 评论 -
synchronized 和 Lock 有什么区别?
synchronized 和 Lock 有什么区别?实现层面不一样。synchronized 是 Java 关键字,JVM层面 实现加锁和释放锁;Lock 是一个接口,在代码层面实现加锁和释放锁 是否自动释放锁。synchronized 在线程代码执行完或出现异常时自动释放锁;Lock 不会自动释放锁,需要再 finally {} 代码块显式地中释放锁 是否一直等待。synchroni...原创 2019-05-29 10:30:35 · 8754 阅读 · 6 评论 -
LongAdder 与 AtomicLong有什么区别?
LongAdder 与 AtomicLong有什么区别? AtomicLong 是基于 CAS 方式自旋更新的;LongAdder 是把 value 分成若干cell,并发量低的时候,直接 CAS 更新值,成功即结束。并发量高的情况,CAS更新某个cell值和需要时对cell数据扩容,成功结束;更新失败自旋 CAS 更新 cell值。取值的时候,调用 sum() 方法进行每个cell累加...原创 2019-06-13 11:04:16 · 7655 阅读 · 0 评论 -
ReadWriteLock 如何使用?
ReadWriteLock 如何使用?ReadWriteLock,读写锁。ReentrantReadWriteLock 是 ReadWriteLock 的一种实现。特点:包含一个 ReadLock 和 一个 WriteLock 对象 读锁与读锁不互斥;读锁与写锁,写锁与写锁互斥 适合对共享资源有读和写操作,写操作很少,读操作频繁的场景 可以从写锁降级到读锁。获取写锁-...原创 2019-06-10 11:49:38 · 6647 阅读 · 0 评论 -
synchronized 和 ReentrantLock 区别是什么?
synchronized 和 ReentrantLock 区别是什么?synchronized 竞争锁时会一直等待;ReentrantLock 可以尝试获取锁,并得到获取结果 synchronized 获取锁无法设置超时;ReentrantLock 可以设置获取锁的超时时间 synchronized 无法实现公平锁;ReentrantLock 可以满足公平锁,即先等待先获取到锁 sy...原创 2019-06-04 19:36:10 · 12471 阅读 · 0 评论 -
JDK 中 Atomic 开头的类实现原子性的原理是什么?
JDK 中 Atomic 开头的类实现原子性的原理是什么? JDK Atomic开头的类,是通过 CAS 原理解决并发情况下原子性问题。 CAS 包含 3 个参数,CAS(V, E, N)。V 表示需要更新的变量,E 表示变量当前期望值,N 表示更新为的值。只有当变量 V 的值等于 E 时,变量 V 的值才会被更新为 N。如果变量 V 的值不等于 E ,说明变量 V 的值已经被更新...原创 2019-06-11 12:29:39 · 5581 阅读 · 2 评论 -
介绍一下 ForkJoinPool
介绍一下 ForkJoinPoolForkJoinPool 是 JDK1.7 开始提供的线程池。为了解决 CPU 负载不均衡的问题。如某个较大的任务,被一个线程去执行,而其他线程处于空闲状态。ForkJoinTask 表示一个任务,ForkJoinTask 的子类中有 RecursiveAction 和 RecursiveTask。RecursiveAction 无返回结果;R...原创 2019-06-12 12:15:58 · 5520 阅读 · 0 评论 -
什么是并发编程?
并发:在程序设计的角度,希望通过某些机制让计算机可以在一个时间段内,执行多个任务。 一个或多个物理 CPU 在多个程序之间多路复用,提高对计算机资源的利用率。 任务数多余 CPU 的核数,通过操作系统的任务调度算法,实现多个任务一起执行。 有多个线程在执行,计算机只有一个 CPU,不可能真正同时运行多个线程,操作系统只能把 CPU 运行时间划分成若干个时间段,再将时间段分配给各个线程执行...原创 2019-08-23 23:21:36 · 4721 阅读 · 0 评论 -
为什么要用并发编程?
1、"摩尔定律" 失效,硬件的单元计算能力提升受限;硬件上提高了 CPU 的核数和个数。并发编程可以提升 CPU 的计算能力的利用率。2、提升程序的性能,如:响应时间、吞吐量、计算机资源使用率等。3、并发程序可以更好地处理复杂业务,对复杂业务进行多任务拆分,简化任务调度,同步执行任务。【Java面试题与答案】整理推荐基础与语法 集合 网络编程 并发编程 Web 安全...原创 2019-08-25 00:48:17 · 3673 阅读 · 0 评论 -
并发编程的缺点?
并发编程的缺点?1、Java 中的线程对应是操作系统级别的线程,线程数量控制不好,频繁的创建、销毁线程和线程间的切换,比较消耗内存和时间。2、容易带来线程安全问题。如线程的可见性、有序性、原子性问题,会导致程序出现的结果与预期结果不一致。3、多线程容易造成死锁、活锁、线程饥饿等问题。此类问题往往只能通过手动停止线程、甚至是进程才能解决,影响严重。4、对编程人员的技术要求较高,编...原创 2019-08-25 21:59:03 · 3408 阅读 · 0 评论 -
创建线程有哪些方式?
创建线程有哪些方式?继承Thread类 实现Runnable接口 实现Callable接口,配合FutureTask 线程池import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;pu...原创 2019-05-13 16:23:36 · 7279 阅读 · 1 评论 -
守护线程是什么
守护线程是什么?Java线程分为用户线程和守护线程。守护线程是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。Java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setDaemon(true) 方法。注意:setDaemon(true) 必须在 start() 之前设置,否则会抛出IllegalThrea...原创 2019-05-13 14:57:41 · 10353 阅读 · 0 评论 -
线程有哪些状态
线程有哪些状态?新建(NEW):新建线程对象,未调用 start 方法 可运行(RUNNABLE):线程对象创建后,被调用 start 方法。此状态的线程位于可运行线程池中,等待获取 CPU 的使用权 运行中(RUNNING):线程获取了 CPU 的使用权,执行程序代码 阻塞(BLOCKED):线程因为某种原因放弃了 CPU 的使用权,暂时停止运行,直到线程进入可运行状态,才有机会再...原创 2019-05-14 12:16:58 · 7767 阅读 · 0 评论 -
多线程锁的升级原理是什么?
多线程锁的升级原理是什么?锁的级别从低到高:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁锁分级别原因:没有优化以前,sychronized是重量级锁(悲观锁),使用 wait 和 notify、notifyAll 来切换线程状态非常消耗系统资源;线程的挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。所以 JVM 对 sychronized 关键字进...原创 2019-05-20 11:04:06 · 22835 阅读 · 5 评论 -
sleep() 和 wait() 有什么区别
sleep() 和 wait() 有什么区别?sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法 sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException...原创 2019-05-15 10:19:31 · 17718 阅读 · 1 评论 -
notify() 和 notifyAll() 有什么区别?
notify() 和 notifyAll() 有什么区别?先解释两个概念。等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁。 锁池:只有获取了对象的锁,线程才能执行对象的 synchronized 代码,对象的锁每次只有一个线程可以获得,其他线程只能在锁池中等待区别:notify() ...原创 2019-05-15 16:22:16 · 40596 阅读 · 1 评论 -
线程的 run() 和 start() 有什么区别?
线程的 run() 和 start() 有什么区别?调用 start() 方法是用来启动线程的,轮到该线程执行时,会自动调用 run();直接调用 run() 方法,无法达到启动多线程的目的,相当于主线程线性执行 Thread 对象的 run() 方法。 一个线程对线的 start() 方法只能调用一次,多次调用会抛出 java.lang.IllegalThreadStateExcept...原创 2019-05-15 17:21:56 · 25921 阅读 · 0 评论 -
什么是死锁?
什么是死锁?线程死锁是指由于两个或者多个线程互相持有所需要的资源,导致这些线程一直处于等待其他线程释放资源的状态,无法前往执行,如果线程都不主动释放所占有的资源,将产生死锁。当线程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。产生原因:持有系统不可剥夺资源,去竞争其他已被占用的系统不可剥夺资源,形成程序僵死的竞争关系。(不可剥夺资源如打印机等)持有资...原创 2019-05-21 14:06:49 · 6650 阅读 · 0 评论 -
怎么防止死锁?
怎么防止死锁?死锁的四个必要条件:互斥条件:线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有其他线程请求该资源,则请求线程只能等待。 不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源的线程自己主动释放。 请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他线程占...原创 2019-05-21 14:28:58 · 15520 阅读 · 2 评论 -
JDK1.8 创建线程池有哪几种方式?
JDK1.8创建线程池有哪几种方式?newFixedThreadPool定长线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程数量不再变化,当线程发生错误结束时,线程池会补充一个新的线程测试代码:public class TestThreadPool { //定长线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程数量不再变化...原创 2019-05-16 12:48:53 · 24142 阅读 · 1 评论 -
线程池有哪些状态?
线程池有哪些状态?线程池的5种状态:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。见 ThreadPoolExecutor 源码// runState is stored in the high-order bits private static final int RUNNING = -1 << COUNT_BITS...原创 2019-05-16 14:26:36 · 9849 阅读 · 0 评论 -
线程池中 submit() 和 execute()方法有什么区别?
线程池中 submit() 和 execute()方法有什么区别?execute() 参数 Runnable ;submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable) execute() 没有返回值;而 submit() 有返回值 submit() 的返回值 Future 调用get方法时,可以捕获处理异常源码分析可参考:h...原创 2019-05-16 15:13:53 · 16269 阅读 · 1 评论 -
java 程序中怎么保证多线程的运行安全?
java 程序中怎么保证多线程的运行安全?线程的安全性问题体现在:原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到 有序性:程序执行的顺序按照代码的先后顺序执行导致原因:缓存导致的可见性问题 线程切换带来的原子性问题 编译优化带来的有序性问题解决办法:JDK Atomic开头的原...原创 2019-05-16 16:29:36 · 32839 阅读 · 4 评论 -
并行和并发的区别
并行和并发有什么区别?并行(parallelism),是同一时刻,两个线程都在执行。 并发(concurrency),是同一时刻,只有一个执行,但是一个时间段内,两个线程都执行了。并行并发【Java面试题与答案】整理推荐基础与语法 集合 网络编程 并发编程 Web 安全 设计模式 框架 算法与数据结构 异常 文件解析与生成 Linu...原创 2019-05-13 09:40:22 · 11394 阅读 · 2 评论 -
线程和进程的区别?
线程和进程的区别?简单总结:进程是系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是CPU调度和分派的基本单位 一个程序至少一个进程,一个进程至少一个线程 每个进程都有独立的内存地址空间;系统不会为线程分配内存,线程组之间只能共享所属进程的资源 程序之间的切换会有较大的开销;线程之间切换的开销小【Java面试题与答案】整理推荐基础与语法 集合 网...原创 2019-05-13 10:56:11 · 11063 阅读 · 0 评论 -
带着问题重学 Java 并发编程
基本概念什么是并发编程?为什么要用并发编程?并发编程的缺点?并行是什么意思?与并发的区别是什么?什么是线程?什么是进程?为什么要有线程?有什么关系与区别?如何创建、启动 Java 线程?如何优雅地停止一个线程?什么是守护线程?线程包括哪些状态?状态之间是如何变化的?什么是线程池?Executors如何创建线程池?线程池包含哪些状态?如何停止一个线...原创 2019-08-23 00:44:44 · 4238 阅读 · 1 评论