
Java-并发编程
文章平均质量分 62
HeatDeath
Learn by doing!
展开
-
Java 并发编程(1) —— 进程和线程的由来
1 操作系统中为什么会出现进程? 说起进程的由来,我们需要从操作系统的发展历史谈起。 也许在今天,我们无法想象在很多年以前计算机是什么样子。我们现在可以用计算机来做很多事情:办公、娱乐、上网,但是在计算机刚出现的时候,是为了解决数学计算的问题,因为很多大量的计算通过人力去完成是很耗时间和人力成本的。在最初的时候,计算机只能接受一些特定的指令,用户输入一个指令,计算机就做一个操作。当用户在思考或者原创 2017-12-31 10:13:42 · 805 阅读 · 0 评论 -
基于双重检查锁定和类初始化(静态内部类)的单例模式
基于 双重检查锁定 的单例模式:public class DoubleCheckedLockingSingleton{ public static volatile DoubleCheckedLockingSingleton instance; public static DoubleCheckedLockingSingleton getInstance(){ ...原创 2018-04-05 12:17:24 · 660 阅读 · 0 评论 -
Java 中的线程池 ThreadPool
线程池主要有以下三种:SingleThreadExecutorFixedThreadPoolCachedThreadPoolSingleThreadExecutor只有一个线程的线程池, 核心线程数为 1, 最大线程数为 1,线程存活时间 0(反正也用不到…),阻塞队列使用的 LinkedBlockingQueue(一个 FIFO 队列)FixedThread...原创 2018-04-22 21:33:46 · 529 阅读 · 0 评论 -
CyclicBarrier和CountDownLatch区别
CyclicBarrier和CountDownLatch区别 这两天写多线程时,用到了CyclicBarrier,下意识的认为CyclicBarrier和CountDownLatch作用很像,就翻阅资料查了一下,说一下他们的区别吧CyclicBarrier和CountDownLatch 都...转载 2018-05-01 21:02:59 · 420 阅读 · 0 评论 -
自己动手写一个死锁 Demo
/** * Author: heatdeath * Date: 2018/7/16 * Desc: */public class DeadLockDemo { private static final Object LOCK_A = new Object(); private static final Object LOCK_B = new Object();...原创 2018-07-16 16:03:23 · 2101 阅读 · 1 评论 -
通过 Demo 理解 Thread.sleep、Object.wait()、Object.notify()、Object.notifyAll() 之间的联系
Demo 代码:public class WaitNotifyDemo { private static boolean flag = true; private static final Object lock = new Object(); public static void main(String[] args) throws Exception { ...原创 2018-07-11 15:16:50 · 1135 阅读 · 0 评论 -
通过 Demo 理解 Condition.await()、Condition.signal()的使用方法
public class ConditionDemo { private static final ReentrantLock lock = new ReentrantLock(); private static final Condition condition = lock.newCondition(); private static boolean flag = t...原创 2018-07-11 15:36:14 · 3380 阅读 · 2 评论 -
通过 Demo 了解 LockSupport 中 park、unpark 的使用
public class LockSupportDemo { private static boolean flag = true; private static final Object lock = new Object(); private static Thread parkedThread; public static void main(String[...原创 2018-07-11 15:51:14 · 1746 阅读 · 2 评论 -
尝试在子线程中获取父线程持有锁
之前有面试官问过是否可以在子线程中获取父线程所持有的锁,我根据以前看过的 ReentrantLock 的源码分析, AQS 的队首节点中保存的是成功获取同步状态 state 的线程引用,与父子线程无关,所以是不可以的今天来实际的测试一下1. ReentrantLock 测试/** * Author: heatdeath * Date: 2018/7/15 * De...原创 2018-07-15 11:45:00 · 2468 阅读 · 1 评论 -
Atomic 中的 incrementAndGet与 getAndIncrement 两个方法的区别
incrementAndGet() /** * Atomically increments by one the current value. * * @return the updated value */ public final int incrementAndGet() { return unsafe.getAn...原创 2018-04-10 11:57:56 · 11412 阅读 · 4 评论 -
Java 并发编程 —— CountDownLatch 的使用方法
什么时候使用CountDownLatch什么时候使用CountDownLatch 阅读目录1 CountDownLatch2 使用 CountDownLatch 控制多个线程执行顺序场景:在学习单例模式时候,用到了锁synchronized的概念,在多线程中又用到了CountDownLatch的概念jdk:https://docs.oracle.com/jav...转载 2018-04-09 20:00:46 · 791 阅读 · 0 评论 -
Java 并发编程(2) —— 创建线程的方法
1 通过继承 Thread 类创建线程 继承Thread类的话,必须重写run方法,在run方法中定义需要执行的任务。class MyThread extends Thread { private static int num = 0; public MyThread() { num++; } @Override public void run(原创 2017-12-31 10:37:10 · 742 阅读 · 0 评论 -
Java 并发编程(3) —— Thread 类的使用
1 线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于后面对Thread类中的方法的理解。 线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)。 当需要新起一个线程来执行某原创 2018-01-01 12:51:45 · 735 阅读 · 0 评论 -
Java 并发编程(4) —— synchronized 关键字
1 什么时候会出现线程安全问题? 在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,而当多个线程同时访问同一个资源的时候,就会存在一个问题: 由于每个线程执行的过程是不可控的,所以很可能导致最终的结果与实际上的愿望相违背或者直接导致程序出错。 举个简单的例子: 现在有两个线程分原创 2018-01-01 13:55:36 · 858 阅读 · 0 评论 -
Java 并发编程(5) —— Lock
1 synchronized 的缺陷 synchronized 是 java 中的一个关键字,也就是说是 Java 语言内置的特性。那么为什么会出现 Lock 呢? 在上面一篇文章中,我们了解到如果一个代码块被 synchronized 修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况: 1)获取锁的线程原创 2018-01-01 18:21:05 · 676 阅读 · 0 评论 -
Java 并发编程(6) —— volatile 关键字
1 内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在原创 2018-01-02 22:58:58 · 2065 阅读 · 0 评论 -
Java 并发编程(7) —— 深入理解 ThreadLocal
1 对 ThreadLocal 的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道 ThreadLocal 为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。 我们还是先来看一个例子:class ConnectionManager { private static转载 2018-02-04 15:07:21 · 466 阅读 · 0 评论 -
Java 并发编程(8) —— 同步容器
1 同步容器出现的原因常见的容器中,如:HashMap、ArrayList、LinkedList、HashSet 等都不是线程安全的容器。所以,Java 提供了 HashTable、Vector 等同步的容器供用户使用。2 Java中的同步容器类 在Java中,同步容器主要包括2类: 1)Vector、Stack、HashTable 2)Collect原创 2018-02-05 20:19:30 · 396 阅读 · 0 评论 -
Java 类锁、对象锁、私有锁
3.6 Java类锁、对象锁、私有锁、隐式锁 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明。一、相关约定为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定:1. 类锁:在代码中的方法上加了static和synchronized的锁,或者synchronized(x...转载 2018-03-18 21:15:29 · 1197 阅读 · 0 评论 -
守护线程学习
参考资料:1、Java中守护线程的总结 https://blog.youkuaiyun.com/shimiso/article/details/89644142、Java 守护线程概述 http://www.importnew.com/26834.htmlJava的线程分为两种:User Thread(用户线程)、DaemonThread(守护线程)。只要当前JVM实例中尚存任何一个非...原创 2018-07-15 14:55:18 · 1131 阅读 · 1 评论