
Java并发
文章平均质量分 79
代码_李
这个作者很懒,什么都没留下…
展开
-
Java并发编程概览
为什么需要并发 并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(时机)分开。这样做可以明显改进应用程序的吞吐量(获得更多的CPU调度时间)和结构(程序有多个部分在协同工作)。做过java Web开发的人都知道,Java Web中的Servlet程序在Servlet容器的支持下采用单实例多线程的工作模式,Servlet容器为你处理了并发问题。Java 5以前的并原创 2017-08-19 18:34:38 · 330 阅读 · 0 评论 -
Java SE 1.6对synchronized的优化
在多线程并发编程中Synchronized一直是元老角色,很多人称呼他为重量级锁。但随着Java SE 1.6对synchronized进行优化之后,有些情况下并不会那么重。在Java SE 1.6中,系统引进了“偏向锁”,“轻量锁”,以及原先就有的“重量级锁”。锁的四种级别由低到高:“无锁”,“偏向锁”,“轻量锁”,“重量级锁”。这四种状态会随着竞争情况逐渐升级。但一旦升级,就不能降原创 2017-08-23 23:40:20 · 1063 阅读 · 0 评论 -
从并发编程角度看Java内存模型
一、Java内存模型(JMM)综述Java内存模型的抽象结构 在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享(本章用“共享变量”这个术语代指实例域,静态域和数组元素)。局部变量(Local Variables),方法定义参数(Java语言规范称之为Formal Method Parameters)和异常处理器参数(ExceptionHandler原创 2017-08-26 22:01:51 · 279 阅读 · 0 评论 -
Executor和线程池
Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。Executor主要类UML:原创 2017-08-21 22:01:06 · 397 阅读 · 0 评论 -
CountDownLatch和CyclicBarrier
CoutDownLatch关键函数:countDown()await()目的:在N个线程都执行完成时,调用latch.await()方法的线程再执行一段逻辑,否则就一直等在latch.await()的地方。用法示例:/** * 工人类 * */ class Worker { private String name; // 名字原创 2017-08-20 16:45:14 · 187 阅读 · 0 评论 -
Java Semopher原理和应用
定义: Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。基本用法:Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。它的用法如下原创 2017-08-20 15:43:41 · 696 阅读 · 0 评论 -
Java Volatile关键字
Java的运行时的内存模型运行时有两类内存,其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个原创 2017-08-06 16:07:28 · 193 阅读 · 0 评论 -
ThreadLocal 导致的内存泄漏
ThreadLocal 实现原理ThreadLocal的实现是这样的:每个Thread 维护一个 ThreadLocalMap 映射表,这个映射表的 key 是 ThreadLocal实例本身,value 是真正需要存储的 Object。也就是说 ThreadLocal 本身并不存储值,它只是作为一个 key 来让线程从 ThreadLocalMap 获取 value。值得注意原创 2017-08-06 22:03:41 · 376 阅读 · 0 评论 -
CAS
CAS定义Compare And Swap/SetCAS 指的是现代 CPU 广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做原子的读写操作。简单介绍一下这个指令的操作过程:首先,CPU 会将内存中将要被更改的数据与期望的值做比较。然后,当这两个值相等时,CPU 才会将内存中的数值替换为新的值。否则便不做操作。最后,CPU 会将旧的数值返回。这一系列的原创 2017-08-19 21:04:52 · 246 阅读 · 0 评论 -
ReentrantLock的原理和应用
ReentrantLock的构造函数ReentrantLock()ReentrantLock(boolean fair)从构造函数可以看出,可以指定是否公平,true构建公平锁,false构建非公平锁。公平锁:AbstractQueuedSynchronizer.tryAquire()的实现会考虑到等待队列。非公平锁:AbstractQueuedSynchronizer.tr原创 2017-08-19 19:44:08 · 272 阅读 · 0 评论 -
ReentrantReadWriteLock
读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁! ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁线程进入读锁的前提条件原创 2017-11-27 10:45:46 · 224 阅读 · 0 评论