
多线程
Alan_Xiang
在读学生
展开
-
volatile关键字
先看一段程序:package concurrent;class ThreadDemo implements Runnable{ private boolean flag = false; public boolean isFlag() { return flag; } public void setFlag(boolean flag) {原创 2017-02-09 21:13:54 · 673 阅读 · 2 评论 -
Java实现流控-Semaphore
网上类似文章很多,不多说,直接上代码:[java] view plain copy/** * 流控类(Semaphore实现) * * @author ln * */ public class FlowControl { /** * 最大访问量 */ private static final int MAX_ACCESS_COUNT = 2转载 2018-03-28 15:20:17 · 1107 阅读 · 0 评论 -
happens-before俗解
一直对happens-before和指令重排序存在误解甚至是不解,直到看到这篇文章。学习Java并发,到后面总会接触到happens-before偏序关系。初接触玩意儿简直就是不知所云,下面是经过一段时间折腾后个人对此的一点浅薄理解,希望对初接触的人有帮助。如有不正确之处,欢迎指正。synchronized、大部分锁,众所周知的一个功能就是使多个线程互斥/串行的(共享锁允许多个线程同时访问,如读锁转载 2018-03-27 20:47:32 · 341 阅读 · 0 评论 -
Java线程池介绍
什么是线程池?线程池提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。作用类似于数据库连接池。 Java中线程池的体系结构如下: java.util.concurrent.Executor : 负责线程的使用与调度的根接口 |–ExecutorService Executor的子接口: 线程池的主要接口 |–Thr原创 2017-02-11 00:15:47 · 423 阅读 · 0 评论 -
Java中的阻塞队列
1. 什么是阻塞队列?阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列提供了四种处理方法:方法\处理方...转载 2017-09-01 19:48:42 · 414 阅读 · 0 评论 -
sleep(),wait(),yield()和join()方法的区别
sleep() sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。 wait() wait()方法需要和notif原创 2017-02-10 17:59:37 · 24160 阅读 · 4 评论 -
悲观锁,乐观锁,行锁,表锁,页锁,共享锁,排他锁
悲观锁: 顾名思义,很悲观,就是每次拿数据的时候都认为别的线程会修改数据,所以在每次拿的时候都会给数据上锁。上锁之后,当别的线程想要拿数据时,就会阻塞,直到给数据上锁的线程将事务提交或者回滚。传统的关系型数据库里就用到了很多这种锁机制,比如行锁,表锁,共享锁,排他锁等,都是在做操作之前先上锁。 行锁: 下面演示行锁,打开两个mysql命令行界面,两个线程分别执行如下操作:(左边先执行)原创 2017-02-14 21:32:22 · 13170 阅读 · 4 评论 -
synchronized实现原理
我们用一个文本文档写一个java类:public class TestSynchronized{public void f(){synchronized(this){System.out.println("ffffffff invoke");}}} 打开cmd,执行javac [.java文件的路径]编译该.java文件,会生成TestSynchronized.class,然后执行java原创 2017-02-25 19:32:13 · 2803 阅读 · 1 评论 -
Lock与synchronized 的区别
多次思考过这个问题,都没有形成理论,今天有时间了,我把他总结出来,希望对大家有所帮助 1、ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定, 如果使用 synchronized ,如果A不转载 2017-02-10 14:59:59 · 435 阅读 · 0 评论 -
Java设计模式之单例模式
饿汉式单例class MySingleton2 { private static MySingleton2 mySingleton2 = new MySingleton2(); private MySingleton2() { } public static MySingleton2 getInstance(){ return mySingleton2;原创 2017-02-15 00:14:17 · 527 阅读 · 0 评论 -
Fork/Join框架测试
Fork/Join框架介绍: 下面使用该框架计算0-50000000000的和,并比较普通计算方法、Fork/Join框架、Java8新特性三种计算方式的计算时间:import java.time.Duration;import java.time.Instant;import java.util.concurrent.ForkJoinPool;import ja原创 2017-02-11 00:43:29 · 994 阅读 · 0 评论 -
一道面试题:多个线程按顺序输出
题目:编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 解题源码:package concurrent;import java.util.concurrent.locks.Condition;import java.util.concurrent.lock原创 2017-02-10 22:04:37 · 6958 阅读 · 0 评论 -
通过生产者消费者案例理解等待唤醒机制和虚假唤醒
首先引入下面这段生产者和消费者的程序,店员类作为生产产品和消费产品的中介,其中的数据product为共享数据,产品最多只能囤积5个,当产品达到5个还在生产时,就会提示“产品已满!”,类似地,如果产品只有0个了还在消费,会提示“缺货!”:package concurrent;//店员类class Clerk { private int product = 0; // 进货 pu原创 2017-02-10 20:33:32 · 1941 阅读 · 0 评论 -
使用Callable和FutureTask创建线程
使用Callable和FutureTask,可以实现有返回值的线程创建,并且可以抛出异常:package concurrent;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;class Callab原创 2017-02-10 11:18:23 · 3761 阅读 · 1 评论 -
闭锁CountDownLatch的用法
现在有十个线程各自输出0-50000中的所有偶数,假设我们试图使用下面这段代码计算整个程序的执行时间:package concurrent;class LatchDemo implements Runnable { @Override public void run() { for (int i = 0; i <= 50000; i++) Sys原创 2017-02-10 10:50:15 · 448 阅读 · 0 评论 -
聊聊并发-Java中的Copy-On-Write容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。转载 2017-02-10 10:16:19 · 356 阅读 · 0 评论 -
HashMap与ConcurrentHashMap的区别
从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心。在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了。ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable转载 2017-02-10 10:10:41 · 526 阅读 · 0 评论 -
原子变量和CAS算法
先运行下面一段程序:package concurrent;class AtomicDemo implements Runnable { private int serialNumber = 0; public int getSerialNumber() { return serialNumber++; } @Override public void原创 2017-02-10 00:46:07 · 3565 阅读 · 0 评论 -
偏向锁,轻量级锁,自旋锁,重量级锁的详细介绍
何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有详细说明,但是方法的同步同样可以使用这两个指令来实现。monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到...转载 2018-10-29 12:09:20 · 915 阅读 · 0 评论