高并发
文章平均质量分 63
毛志荣
推崇用最朴实的语言进行技术传播
展开
-
理解高并发(1).序言
高并发已不是个热词, 然而用好它并非易事,很多时候如果没有使用得当,极容易产生适得其反的效果。 本系列我将系统性的给大家分享高并发的技术要点。 其具体技术点包括以下: 1. 我对并发编程的理解 2. synchronized原理及用法 3. 显式锁的用法 4. 锁的优化技巧 5. 线程通信之_wait/notify 6. 线程通信之_semaphore信号量 7. 线程通信之_cou原创 2017-07-24 12:29:58 · 316 阅读 · 0 评论 -
理解高并发(11).线程通信之_join使用及原理
概述 根据jdk官方API的定义: Thread.join方法是阻塞调用线程(也称阻塞主线程),待被调用线程(子线程)运行结束后主线程才会被唤醒。 通常用在main方法中。 替代方案 jdk1.7 CountDownLatch join底层实现原理 wait、notify机制,可以深入的查看底层实现源码: /** 2 * Waits at most millis原创 2017-08-07 12:55:31 · 350 阅读 · 0 评论 -
理解高并发(13).完成后给我报告countDownLatch
概念 : 固定多少个任务,每个线程执行完一次做一次减操作, 直至任务数为0,主线程才继续往下执行。 常用方法: //声明任务个数为20 final CountDownLatch latch = new CountDownLatch(20); // 任务数减1 latch.countDown(); //阻塞,直到任务数为0才被唤醒继续执行 latch.await(); 使用原创 2017-08-07 12:57:58 · 295 阅读 · 0 评论 -
理解高并发(20).大白话阿姆达尔定律
技术来源于生活,技术又改变了生活。 从生活中的例子说起 要完成拖地和烧开水这么一个工作, 假设烧开水需要花费 2分钟, 拖地需要2分钟, 各占总时间的50%。 为了赶时间,我发动老婆一块帮忙, 因为烧开水的时间不为人所能控制,因此增派人手能做的工作只能是打扫卫生, 此时完成整项工作可提升的速度为: 可提升效率倍数: 1/( 0.5 + 0.5/2) = 1.3 倍 , 总完成时长原创 2017-08-26 22:06:36 · 1222 阅读 · 0 评论 -
理解高并发(19).volatile原理及用法
功能 volatile关键字有2大作用, 保证被修饰的语句在执行和编译时不被优化 下面的例子,如果不加volatile,执行器对stop的取值仅从本地工作内存中获取,这样的话会造成即使该值被其它线程修改无无从感知。 专业点讲:禁止指令重排序 保证线程能够获取到最新值 如果增加volatile修饰,每次都从主存中获取,可以取到最新值. 专业点讲:保证可见性原创 2017-08-26 22:04:04 · 332 阅读 · 0 评论 -
理解高并发(18).编写自己的threadlocal
李四 当前投票次数 :5 张三 当前投票次数 :4 李四 当前投票次数 :6 张三 当前投票次数 :5 李四 当前投票次数 :7 张三 当前投票次数 :6 李四 当前投票次数 :8 张三 当前投票次数 :7 李四 当前投票次数 :9 张三 当前投票次数 :8 李四 当前投票次数 :10 张三 当前投票次数 :9 李四 over 张三 当前投票次数 :10 张三 over原创 2017-08-26 22:02:27 · 276 阅读 · 0 评论 -
理解高并发(17).threadlocal原理及用法
概述 threadlocal 是线程本地变量的意思, 它能够将主内存空间中的共享变量拷贝一份到本地工作内存空间, 使多个线程操作共享变量互不影响, 达到了线程安全的效果。 场景 特别适合于控制每个线程某个业务的执行次数,例如:做投票系统,限制每个线程的投票次数 实现原理 将变量保存到当前线程的ThreadLocalMap实例里面 ThreadLocalMap可以理解原创 2017-08-26 22:01:18 · 744 阅读 · 0 评论 -
理解高并发(14).到齐后才能开干_cyclicBarrier
概念 循环栅栏。工作线程必须等待其它线程都到达后才能够继续。 这就好比500米短跑比赛, 3跑道必须等到3人都到齐后才能开始赛跑。 与CountDownLatch区别 CountDownLatch 的使用场景更多的是侧重于主线程-从线程协调工作 而CyclicBarrier侧重的是多个从线程之间的协调工作 示例代码 5个线程都到齐后才会开始工作。 public c原创 2017-08-26 21:58:48 · 244 阅读 · 0 评论 -
理解高并发(15).Future、Callable实现原理及用法
概述 jdk1.5推出的,使用它能带来2个方便: 能够获得到线程执行后返回的结果 线程异常有效捕获 简单例子 输出结果:result=hello public class ThreadLocalTest { @SuppressWarnings("unchecked") public static void main(String[] args) { Execu原创 2017-08-26 21:59:43 · 1415 阅读 · 0 评论 -
理解高并发(10).线程通信之_线程中断技术
对于线程中断,需要注意的几点: interrupt() 让阻塞的线程中断处理 try{ Thread.sleep(3000L); }catch(InterruptedException e){ /************************* 运行interrupt()后会抛出InterruptedException 异常 如果希望中断处理的话,需要做如下操作: 1.原创 2017-08-07 12:53:36 · 358 阅读 · 0 评论 -
理解高并发(12).限定并发个数_semaphore信号量
概念 : Semaphore 控制允许最大并发执行线程数, 当达到设置阀值后,阻塞,否则放行。 对应的函数: //构造最大允许6个并发的线程许可 Semaphore semp = new Semaphore(6); //获得到许可, 可用许可数-1 semp.acquire(); //释放许可, 可用许可 + 1 semp.release(); 原理: 从待执行线程队列原创 2017-08-07 12:56:20 · 608 阅读 · 1 评论 -
理解高并发(2).我对并发编程的理解
对于并发编程, 涉及的技术点非常多, 我们首先需要明确一些基本概念,只有概念清晰,才能做到在以后深入学习关键技术的过程中不致于感觉到吃力和迷惑。 其次,我们还需要明白在并发编程最需要关注的问题是什么? 带着关键问题去学习,才能够起到事办功倍、稳扎稳打的效果。 下面是我所总结的一些很多人容易混淆的概念: 1. 高并发、多线程 高并发 高并发是请求,指的是多个客户端同一时刻向服原创 2017-07-24 12:31:43 · 4792 阅读 · 1 评论 -
理解高并发(3).多线程开发常见问题示例
多线程开发过程中,经常会出现的一些问题:非线程安全、死锁、饥饿锁。 示例代码如下: 非线程安全 package com.zuche.thread.demo1; public class TestClient { public static void main(String[] args) { final Account account = new Accoun原创 2017-07-24 12:32:40 · 414 阅读 · 0 评论 -
理解高并发(4).死锁监测方法
windows环境: 查看当前活动java进程 jstack 堆信息输出 分析堆信息,发现死锁 死锁的通用解决法则: 按相同的顺序加锁。原创 2017-07-24 12:34:40 · 315 阅读 · 0 评论 -
理解高并发(5).synchronized原理及用法
历史最优久的使用最方便的线程同步的关键字。必须点赞 一、synchronized 特性 同一时刻只有一个线程访问临界资源 其它未获取到锁执行权的线程必须排队等待 保证共享资源的原子性、可见性和有序性 进入synchronized范围内自动加锁,synchronized作用域外锁自动消除,即使异常也会释放锁 简单方便(不需要人工释放锁) jdk1.6后性能做了很大优化原创 2017-08-01 12:24:46 · 1605 阅读 · 0 评论 -
理解高并发(6).jvm对内置锁的优化
早期的synchronized性能低下, 因为监视器锁monitor是依赖于底层操作系统的mutx-lock实现,当多个线程在monitor中的wait队列中竟争上岗时会发生线程状态切换, 这种切换需要由操作系统的内核态转化为用户态,性能比较低下。 jdk1.6对synchronized做了很多优化, 性能已经提升了很多。 具体优化策略,在对象头中引入了轻量级锁、偏向锁等标识。原创 2017-08-01 12:27:11 · 1026 阅读 · 0 评论 -
理解高并发(7).编程过程中锁的优化技巧
分拆(段)锁 把一个集合看分成若干partition, 每个partiton一把锁。ConcurrentHashMap就是分了 16个区域,这16个区域之间是可以并发的。 mysql innode的行级锁运用的就是该思想。 尽量减小锁的控制范围 范围越大,运行时间越长 尽量减小锁的使用时间 运行时间越长,其它线程等待的时间就越长 分离原创 2017-08-01 12:28:46 · 426 阅读 · 0 评论 -
理解高并发(8).可重入锁RetreenLock用法
一、概述与区别 jdk1.5新增RetreenLock机制 并不是为了替代内置锁, 而是当内置锁不能满足锁的高级需求时jdk提供的一种可选锁方案 具有与内置锁相同的内存语义 内置锁是非公平锁,竟争上岗 lock锁有更高级的功能,如结合条件上锁、构造公平锁(FIFO) synchronized使用更加简洁方便 实现原理, 内置锁采用悲观锁机制,内部锁通过对象头中的指针monit原创 2017-08-01 12:30:53 · 8875 阅读 · 2 评论 -
理解高并发(9).线程通信之_wait、notify
消息通信的两种模型: 消息传递 wait/notify是采用该种机制实现的。 是借助于操作系统底层的消息通信机制。 共享内存 多线程中的数据同步的内存可见性是基于些模型。例如,A线程修改了变量值, 该变量的值会先写回主内存,然后再由B线程从主内存读取过来。 概念: wait: 当前线程释放锁的使用权,进入阻塞阶段 notify: 随机唤醒一个阻塞的线程,原创 2017-08-01 12:31:45 · 305 阅读 · 0 评论 -
理解高并发(16).自己动手编写Future、Callable
实现带返回值的线程调用方式有很多, 这里主要是借助LockSupport工具来实现。 MyFuture.java类: 功能职责: 1、实现runnable接口,使其具体线程的特质 2、 提供future的get方法,使调用者能够获取到返回值 package com.test.thread.demo13; import java.util.concurrent.lock原创 2017-08-26 22:00:34 · 274 阅读 · 0 评论