
Java并发编程
在云端123
这个作者很懒,什么都没留下…
展开
-
Java并发编程 | 第七篇:ThreadLocal
ThreadLocal介绍保证所有对象的线程安全除了可以使用锁,还有使用ThreadLocal,当使用ThreadLocal维护变量,ThreadLocal为每个使用变量的线程提供独立的变量副本,所以每一个线程可以独立修改自己的副本,从而隔离了多个线程对数据的访问冲突,在编写多线程代码时,可以把不安全的变量封装到ThreadLocal。前面提到的锁是“以时间换空间”,让不同的线程排队访问同...原创 2017-04-29 11:16:54 · 1164 阅读 · 0 评论 -
Java并发之AQS详解
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大纲:...转载 2019-04-03 10:00:43 · 283 阅读 · 0 评论 -
Java并发编程 | 第八篇:java synchronized关键字的用法以及锁的等级:对象锁、类锁
对象锁用于对象实例方法,类锁用于类的静态方法或一个类的class对象。类的对象实例可以有很多,不同对象实例的对象锁互不干扰,而每个类只有一个类锁 他们用来帮助理解锁定实例方法和静态方法的区别 下面是synchronized 代码块和修饰方法public class TestSynchronized { public void test1() { synchron...原创 2017-05-03 14:14:08 · 981 阅读 · 0 评论 -
final的内存语义
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面,我们通过一些示例性的代码来分别说明...转载 2017-08-09 10:01:41 · 983 阅读 · 0 评论 -
锁的内存语义
锁的释放-获取建立的happens before关系锁是Java并发编程中最重要的同步机制,锁除了了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息public class MonitorExample { int a = 0; public synchronized void writer() {// 1 a++;// 2 }// 3原创 2017-08-09 09:52:04 · 1049 阅读 · 0 评论 -
volatile的内存语义
volatile特性把对volatile变量的单个读、写,看出是使用同一个锁对这些单个读、写做了同步,比如:public class VolatileFeaturesExample { volatile long vl = 0L; public void set(long l) { vl = l; } public void getAndIncrement(原创 2017-08-09 07:27:13 · 2190 阅读 · 2 评论 -
简单死锁例子
/* * * 一个简单的死锁类 * 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500毫秒 * 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500毫秒 * td1睡眠结束后需要锁定o2才能继续执行,而此时o2已被td2锁定; * td2睡眠结束后需要锁定o1才能继续执行,而此时o1已被td1锁定; * td1、td2相互等待原创 2017-08-08 15:56:16 · 636 阅读 · 0 评论 -
Akka之Hello World
Akka介绍http://blog.youkuaiyun.com/liubenlong007/article/details/53782966Actor介绍在使用Akka进行并行程序开发时,我们的关注点不在线程,因为线程调度已经被Akka框架进行封装,我们关注一个全新的执行单元,就是Actor,Actor对象之间的交流和一般的对象的函数调用不一样,它们是通过显示的消息发送来传递信息的hello world1、第原创 2017-04-24 22:52:42 · 947 阅读 · 0 评论 -
Java并发编程 | 第六篇:Fork/Join框架
Fork/Join框架的介绍Fork/Join框架是Java7提供了的一个用于并发执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架Fork/Join执行逻辑 工作窃取算法工作窃取算法是指某个线程从其他队列中窃取任务来执行 在一般情况下,一个物理线程实际需要处理多个逻辑任务,因此每个线程必然需要拥有一个任务队列。比如,线程A已经把...原创 2017-04-24 18:56:06 · 1007 阅读 · 0 评论 -
Java并发编程 | 第五篇:Java并行模式之并行流水线
假如现在有两个数,B和C。如果要计算(B+C)*B/2,那么这个运算过程就是无法并行的。原因是,如果B+C没有执行完成,则永远算不出(B+C)*B,这就是数据相关性。 可以借鉴日常生产中的流水线思想,首先将计算过程拆分为三个步骤: P1:A=B+C P2:D=AxB P3:D=D/2 上述步骤中P1、P2和P3均在单独的线程中计算,并且每个线程只负责自己的工作。此时,P3的计算结果就是最...原创 2017-04-24 16:54:33 · 2331 阅读 · 0 评论 -
Java并发编程 | 第四篇:Future模式
一、什么是Future模型常见的多线程设计模式有:单例模式、不变模式、生产者-消费者模式、Future模式;而这里介绍Future模式,它的核心思想就是异步调用。当我们需要调用一个函数,但是这个函数执行很慢,如果我们不需要马上知道结果,我们可以立即返回,让它在后台慢慢处理这个请求,对于调用者来说,可以先处理一些其他任务,这个就充分利用等待时间,在真正需要数据场合再去尝试获取需要的数据。 ...原创 2017-04-24 15:56:39 · 1462 阅读 · 4 评论 -
Java并发编程 | 第一篇: Java线程池
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。就好比原来去食堂打饭是每个人看谁抢的赢,谁先抢到谁先吃,有了线程吃之后,就是排好队形,今天我跟你关系好,你先来吃饭。比如:一个应用要和网络打交道,有很多步骤需要...原创 2017-02-24 21:02:42 · 1804 阅读 · 0 评论 -
面试题:用 wait-notify 写一段代码来解决生产者-消费者问题
public class ProductTest { public static void main(String[] args) { Clerk clerk = new Clerk(); Thread producerThread = new Thread(new Producer(clerk)); Thread co原创 2017-02-24 10:31:24 · 7760 阅读 · 0 评论 -
Java并发编程 | 第二篇:ReentrantLock重入锁
首先重入锁用ReentrantLock来实现的,关于重入锁ReentrantLock的几个重要方法: 1、lock():获得锁,如果锁被占用,只能等待 2、lockInterruptibly():获得锁,可以响应中断 3、tryLock():尝试获得锁,如果成功返回true,失败返回false,该方法不等待,立即返回 4、tryLock(long time,TimeUnit unit):设...原创 2017-04-02 11:30:40 · 913 阅读 · 0 评论 -
Java并发编程 | 第三篇:数据共享通道之BlockingQueue
首先BlockingQueue是一个接口,它的实现类是这些 里面有基于数组实现的ArrayBlockingQueue,适合有界队列和基于链表实现的LinkedBlockingQueue,适合无界队列,因为长度可以动态增加为什么BlockingQueue可以做数据共享通道因为BlockingQueue会让服务线程(不断从队列中取任务,然后进行处理的线程)在队列为空时进行等待,当新的...原创 2017-04-24 00:20:32 · 897 阅读 · 0 评论 -
阻塞队列BlockingQueue源码分析
介绍BlockingQueue通常用于一个线程在生产对象,而另外一个线程在消费这些对象的场景,例如在线程池中,当运行的线程数目大于核心的线程数目时候,经常就会把新来的线程对象放到BlockingQueue中去。阻塞队列原理原理简单的来讲:就是一个线程往队列里面放,而另外的一个线程从里面取当线程持续的产生新对象并放入到队列中,直到队列达到它所能容纳的临界点。注意,队列的容量是有限的,不可能...原创 2019-08-22 11:00:17 · 297 阅读 · 0 评论