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