
java高并发
文章平均质量分 92
wangdongli_1993
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java高效并发(三)----线程安全、synchronized同步控制、reentrantlock重入锁
线程安全 如果一段代码本身封装了一些安全机制(如同步),而调用者在使用的时候也无需采取任何保护措施来保证多线程的正确调用,那么代码就是线程安全的。 Java的线程安全 前提是多线程之间共享资源,有竞争关系才讨论是否是线程安全的,若不存在共享当然安全。java各种操作共享数据根据安全程度分为5类. 不可变 不可变的对象必然线程安全,实现不可变可以使用final关键字修饰,例如我们的Stri...原创 2018-07-25 18:24:15 · 353 阅读 · 0 评论 -
Java高效并发(六)----jdk并发包的线程池认识
线程池 为了避免频繁的创建线程和销毁线程带来的消耗,我们创建线程池,让线程进行复用,在线程池中总有几个活跃的线程在工作,当有新任务提交时,空闲线程就可以去执行,而不必新建线程,当任务执行完毕不是销毁线程,而是把他归还给线程池,以便复用。 Executor框架 在J.U.C并发包中JDK提供了几个支持线程池的核心类,如下: (1)java.util.concurrent.Executo...原创 2018-07-27 20:21:11 · 218 阅读 · 0 评论 -
Java高效并发(五)----jdk并发包的信号量、读写锁、倒计时器、循环栅栏,线程阻塞类工具
javautil.concurrent包(J.U.C) J.U.C核心有5部分组成,atomic包,locks包,collections包,tools包,executors包 这一篇主要讲locks包,上一篇中的重入锁ReentrantLock类就是实现了locks包中的lock接口。 (1)信号量(java.util.concurrent.Semaphore) 无论是内部锁synchro...原创 2018-07-27 16:24:08 · 748 阅读 · 0 评论 -
Java高效并发(十二)----非阻塞同步方案实现线程安全
前面我们讲了互斥同步和无同步方法实现线程安全,其中互斥同步也叫阻塞同步,接下来学习的是非阻塞同步实现线程安全 非阻塞同步 互斥同步是一种悲观锁,认为竞争总是会发生,那么非阻塞同步就是一种基于冲突检测的乐观并发策略。这里就是用到之前说过的CAS操作检测冲突,如果没有冲突,CAS操作成功就继续执行操作,如果有冲突,就采取其他补救措施,一般是不断尝试CAS操作直到成功为止。这种乐观的并发策略的许多...原创 2018-07-30 18:29:33 · 2140 阅读 · 0 评论 -
Java高效并发(十一)----无同步方案实现线程安全ThreadLocal
前面我们学习了同步控制线程安全,同步的实现有本地锁Synchronized关键字以及重入锁ReentrantLock。同步就是控制访问资源的角度实现线程安全,但是实现线程安全,不一定非得同步,也可以从增加共享资源的角度出发。 人手一支笔(ThreadLocal) 如果一个变量要被线程独享,可以通过java.lang.ThreadLocal类实现线程本地存储的功能。既然是本地存储的,那么就只有当...原创 2018-07-30 16:55:57 · 585 阅读 · 0 评论 -
Java高效并发(十)----JVM中的锁优化策略
CAS操作 比较交换算法,CAS操作包含三个参数CAS(V,E,N),V表示要更新的变量,E表示预期值,N表示新值,当且仅当现在V的值等于E才会把V的值更新为N,如果在V的值不等于E,说明有线程对V做了更改,则CAS更新失败,对于更新失败的线程可以继续尝试或者放弃更新。 简单的说就是你给出一个期望值,如果变量不是你想的期望值,那就说明别人操作过这个值了,你可以重新读取,更换期望值,然后再尝试...原创 2018-07-30 11:52:21 · 720 阅读 · 0 评论 -
Java高效并发(四)----锁优化、ConcurrentHashMap、LinkedBlockingQueue锁分离
有助于提高锁性能的几点建议 减少锁的持有时间 只有在必要的时候进行同步,明显减少锁的持有时间,降低锁冲突的可能性,提高并发能力 比如,使用synchronize同步锁,尽量加到要对象需要共享变量状态的时候,不是一味的对整个方法前加synchronize,直接给调用这个方法的对象上锁,增大了锁竞争的概率 读写锁分离替换独占锁 之前讲过使用ReadWriteLock读写分离提高...原创 2018-07-29 20:21:57 · 1878 阅读 · 0 评论 -
Java高效并发(十)----ForkJoin框架
分而治之策略 当我们要处理很大的数据,一个重要的思想就是把问题划分成若干个小问题处理,然后把小问题的结果进行整合,得到最终的结果。在JDK中有一个ForkJoin线程池,使用fork/join方法处理数据。Fork/Join 模式有自己的适用范围。如果一个应用能被分解成多个子任务,并且组合多个子任务的结果就能够获得最终的答案,那么这个应用就适合用 Fork/Join 模式来解决 ForkJoi...原创 2018-07-29 16:14:50 · 408 阅读 · 0 评论 -
Java高效并发(九)----扩展线程池寻找堆栈信息
线程池的异常堆栈 使用线程池实现高并发会更有可能出现一些意想不到的异常,而线程池往往可能会“吃”点这些异常,就是我们常说的Runnable没有返回值,不能抛出受检查的异常。让我们的结果有误但是却不给我们异常信息。要排查这些异常找出问题所在,我们就要分析异常堆栈,追踪问题出在哪里。 让线程池返回异常堆栈的信息,最简单的就是在线程池提交任务的时候不用submit(),而是改用execute()方法...原创 2018-07-29 12:10:28 · 660 阅读 · 0 评论 -
Java高效并发(八)----扩展线程池、退出线程池、优化线程池的线程数量
ThreadPoolExecutor是一个可以扩展的线程池 在 ThreadPoolExecutor类中有三个空的方法,可以看到这三个方法都是protected权限的 protected void beforeExecute(Thread t, Runnable r) { } protected void afterExecute(Runnable r, Throwable t) { } ...原创 2018-07-29 10:50:41 · 1801 阅读 · 0 评论 -
Java高效并发(二)----JAVA线程实现、调度、状态
进程与线程的区别 进程:CPU资源分配的最小的单位,由进程的各个线程共享 线程:cpu执行调度的最小单位,优点充分利用CPU资源 操作系统线程的实现 主流的操作系统都提供了线程的实现 (1)内核线程实现 内核线程(KLT)就是由操作系统内核直接支持的线程,内核通过操纵调度器对线程进行调用,程序不直接与内核线程接触而是通过一种高级接口轻量级进程(LWP),它与内核线程一一对应,这就是我们...原创 2018-07-25 17:20:52 · 1385 阅读 · 0 评论 -
Java高效并发(一)----内存模型(区别于内存结构)volatile关键字
首先定义几个下面会用到术语 原子性 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。 可见性 指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值 有序性 java有序性可以总结为:在本地线程观察操...原创 2018-07-25 16:28:26 · 482 阅读 · 0 评论 -
Java高效并发(七)----jdk并发包的线程池参数详解
在上一篇谈到了线程池的参数代表的意义: 从创建线程池的几个方法来看,后面两个参数都是有默认的参数 接下来本篇将对workQueue,threadFactory,handler这三个参数再深入研究 workQueue(任务队列) 它是BlockingQueue接口的一个对象,用于存放Runnable对象,在ThreadPoolExecutor构造方法中可以使用下面几种Block...原创 2018-07-29 09:33:57 · 633 阅读 · 1 评论