并发编程
骆驼绵羊
不像程序猿的猿
展开
-
Java并发编程:volatile关键字解析
ava并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型转载 2016-04-10 20:12:15 · 651 阅读 · 4 评论 -
Java并发编程:Lock解析
从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronized的缺陷讲起,然后再讲述java.util.concurrent.locks包下常用的有哪些类和接口,最后转载 2016-07-23 16:59:23 · 306 阅读 · 0 评论 -
java并发你必须会的编程
1. Fork/Join框架Fork/Join框架是JDK7提供的一个用于并行执行任务的框架,是一个把大任务切分为若干子任务并行的执行,最终汇总每个小任务后得到大任务结果的框架。我们再通过Fork和Join来理解下Fork/Join框架。Fork就是把一个大任务划分成为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。 使用Fork/Joi原创 2016-08-28 16:36:13 · 768 阅读 · 0 评论 -
指令重排与happens-before
我们在平时所习惯的单线程编程中默认了一种乐观的模型——串行一致性。即在程序中只存在唯一的操作执行顺序,并且在每次读取变量时,都能获得在执行序列(任何处理器)最近一次写入该变量的值。但在JMM以及底层的任何一看现代多处理器架构中都不会提供这种串行一致性。这在并发编程中会造成一些在单线程环境下看来难以理解的现象。什么是线程安全:当多个线程访问一个类时,如果不用考虑这些线程在运行转载 2016-08-19 09:57:07 · 471 阅读 · 0 评论 -
Java并发必须知道的零碎知识(二)
1. Wait/notify与Condition.await /condition.signal /Condition.signalAll一个Condition和一个Lock关联在一起,就想一个条件队列和一个内置锁相关联一样。要创建一个Condition,可以在相关联的Lock上调用Lock.newCondition方法。正如Lock比内置加锁提供了更为丰富的功能,Condition同样比内原创 2016-08-29 22:04:25 · 593 阅读 · 0 评论 -
JUC——CLH队列锁
自旋锁、排队自旋锁、MCS锁、CLH锁的概念讲述Next:CLH队列锁分析CLH是AQS的实现基础,Java并发包很多也是基于AQS,所以CLH和AQS还是要了解一下的,直接点击上面链接即可。太懒了~~~转载 2016-08-19 15:48:15 · 688 阅读 · 0 评论 -
ThreadLocal 使用分析
1.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定原创 2016-08-20 22:00:13 · 314 阅读 · 0 评论 -
Java并发必须知道的零碎知识(一)
1. 线程和进程进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。但是要注意,一个进程虽然包括多个线程,但是这些线程是共同享有进程占有的资源和地址空间的。进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位。 2. 实现线程在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如原创 2016-08-29 22:01:44 · 698 阅读 · 0 评论 -
Callable和Future
接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执转载 2016-08-24 17:31:44 · 317 阅读 · 0 评论 -
Java并发你必须知道的结构
1. ConcurrentHashMap ConcurrentHashMap是线程安全的HashMap,内部采用分段锁来实现,默认初始容量为16,装载因子为0.75f,分段16,每个段的HashEntry[]大小为2。键值都不能为null。每次扩容为原来容量的2倍,ConcurrentHashMap不会对整个容器进行扩容,而只对某个segment进行扩容。初始化: 初原创 2016-08-29 21:56:31 · 802 阅读 · 0 评论 -
ThreadLocal解决SimpleDateFormat问题
大致意思:Tim Cull碰到一个SimpleDateFormat带来的严重的性能问题,该问题主要有SimpleDateFormat引发,创建一个 SimpleDateFormat实例的开销比较昂贵,解析字符串时间时频繁创建生命周期短暂的实例导致性能低下。即使将 SimpleDateFormat定义为静态类变量,貌似能解决这个问题,但是SimpleDateFormat是非线程安全的,同样存在问题,转载 2016-08-25 14:53:55 · 2725 阅读 · 1 评论 -
JUC——AQS
AbstractQueuedSynchronizer为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。AQS简介使用深入简介获取和释放锁共享和互斥原理分析好难原创 2016-08-19 17:20:53 · 383 阅读 · 0 评论 -
Java并发编程:synchronized关键字解析
虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。一、什么时候会出现线程安全问题 在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的转载 2016-07-23 15:57:10 · 375 阅读 · 0 评论 -
java并发编程:线程等待与唤醒
一、wait(), notify(), notifyAll()等方法介绍在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而not转载 2016-08-05 11:45:31 · 421 阅读 · 0 评论 -
CopyOnWriteArrayList与Collections.synchronizedList的性能对比
一 、ArrayList ArrayList是非线性安全,此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。即在一方在便利列表转载 2016-08-02 15:59:19 · 699 阅读 · 0 评论 -
性能优化之使用线程池处理异步任务
1. 创建线程 创建线程常用的有两种方式: 1. 继承Thread类 2.实现Runnable接口public class Test { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); }}转载 2016-07-17 20:56:51 · 2674 阅读 · 0 评论 -
JUC(四)—— ConcurrentHashMap
概述 HashMap是非线程安全的哈希表,常用于单线程程序中。 Hashtable是线程安全的哈希表,它是通过synchronized来保证线程安全的;即,多线程通过同一个“对象的同步锁”来实现并发控制。Hashtable在线程竞争激烈时,效率比较低(此时建议使用ConcurrentHashMap)!因为当一个线程访问Hashtable的同步方法时,其它线程就访问Hashta转载 2016-08-05 09:19:50 · 321 阅读 · 0 评论 -
java并发编程:基本概念
线程状态图如下:说明:一个线程可以处于以下几种状态之一:新建、就绪、运行、阻塞、死亡1. 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。当线程被创建时,它只会短暂地处于这种状态,此时它已经分配了必须的系统资源,并执行了初始化,此时线程已经有资格获得CPU转载 2016-08-05 10:08:17 · 319 阅读 · 0 评论 -
JUC原子类 Atomic***** 基本类型
1. 功能简介原子量和普通变量相比,主要体现在读写的线程安全上。对原子量的是原子的(比如多线程下的共享变量i++就不是原子的),由CAS操作保证原子性。对原子量的读可以读到最新值,由volatile关键字来保证可见性。原子量多用于数据统计(如接口调用次数)、一些序列生成(多线程环境下)以及一些同步数据结构中。Atomic...基本类型包括:AtomicInteger, At转载 2016-08-17 09:11:05 · 516 阅读 · 0 评论 -
JUC原子类 Atomic***** 使用
一、Atomic简介Atomic包是Java.util.concurrent下的另一个专门为线程安全设计的Java包,包含多个原子操作类。这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择转载 2016-08-17 10:55:29 · 778 阅读 · 0 评论 -
java并发编程:线程让步
yield( ) yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!class ThreadA extends Thread{ public Thre转载 2016-08-05 15:20:48 · 268 阅读 · 0 评论 -
java并发编程:join用法
join是Thread类的一个方法,启动线程后直接调用,例如:Thread t = new AThread(); t.start(); t.join();为什么要用join( ) 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线转载 2016-08-05 16:37:05 · 368 阅读 · 0 评论 -
Java并发编程:进程和线程之由来
一、操作系统中为什么会出现进程说起进程的由来,我们需要从操作系统的发展历史谈起。 也许在今天,我们无法想象在很多年以前计算机是什么样子。我们现在可以用计算机来做很多事情:办公、娱乐、上网,但是在计算机刚出现的时候,是为了解决数学计算的问题,因为很多大量的计算通过人力去完成是很耗时间和人力成本的。在最初的时候,计算机只能接受一些特定的指令,用户输入一个指令,计算机就做一个操作。当用户在思考转载 2016-07-17 16:35:44 · 288 阅读 · 0 评论 -
JUC (一) ——集合类
阿里电面的时候被问到JUC,刚好木有看完...感觉被鄙视了 哭....好好看书学习... 下面,我们先了解JUC包中集合类的框架;为了方便讲诉,我将JUC包中的集合类划分为3部分来进行说明。在简单的了解JUC包中集合类的框架之后,后面的章节再逐步对各个类进行介绍。1.List和SetJUC集合包中的List和Set实现类包括:Copy转载 2016-08-02 10:40:18 · 3387 阅读 · 0 评论 -
JUC(二)—— 聊聊 Copy-On-Write
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。转载 2016-08-02 10:56:54 · 438 阅读 · 0 评论 -
JUC (三)—— CopyOnWriteArrayList、CopyOnWriteArraySet
1. CopyOnWriteArrayList介绍它相当于线程安全的ArrayList。和ArrayList一样,它是个可变数组;但是和ArrayList不同的时,它具有以下特性:1. 它最适合于具有以下特征的应用程序:List 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。2. 它是线程安全的。3. 因为通常需要复制整个基础数组,所以可变操转载 2016-08-02 15:10:43 · 763 阅读 · 0 评论 -
Java线程之InterruptedException
1. InterruptedException异常概述当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法。 抛InterruptedException的代表方法有:1. Java.lang.Object 类的 wait 方法2. java.lang.Thread 类的 sleep 方法3. java转载 2016-09-06 16:29:16 · 586 阅读 · 0 评论