并发
文章平均质量分 67
longlynn
爱生活!爱技术!
展开
-
JAVA并发编程实战——对象的共享
3.1 可见性 当多个线程访共享变量时,如果没有正确的同步机制,那么这些线程之间对对象的操作是互相不可见的。public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends原创 2016-12-20 22:41:45 · 405 阅读 · 0 评论 -
JAVA多线程之——读写锁 ReentrantReadWriteLock
ReentrantReadWriteLock锁的类型有很多,前面学习了阻塞锁、互斥锁、自旋锁等。今天学习读写锁。所谓读写锁就是维护了一个读锁和写锁。但是读锁和写锁互斥、写锁和写锁互斥。读锁和读锁不互斥。既允许多个读锁同时读。但是同时间只有一个写锁写。读写锁也是可重入锁。 根据JDK文档描述,所以读写锁以下几个特点: 1. 读写锁对于读锁与写锁的获取顺序不会干涉。 2. 非公平模式下可能会原创 2017-04-02 23:17:47 · 308 阅读 · 0 评论 -
JAVA多线程之——经典面试消费者与生产者
用wait与notify、notifyAll 实现生产者与消费者 关于多线程的生产者与消费者有多种方式实现。目前用学过的wait、notifyAll来实现。代码:public class ThreadTest6 { static class Storehouse { private int capacity; // 仓库的容量 private int siz原创 2017-03-26 15:23:32 · 5394 阅读 · 0 评论 -
JAVA多线程之——CopyOnWriteArrayList
线程安全的list在学list的时候,应该都了解过ArrayList是线程不安全的集合。今天学习线程安全的一个list集合。CopyOnWriteArrayList。 CopyOnWrite 从取名来看CopyOnWriteArrayList实质上就应该是个ArrayList。只是多了一个CopyOnWrite(写入时复制) 思想是计算机程序设计领域中的一种优化策略。其核心思想是,如果有多个调原创 2017-04-03 13:05:22 · 723 阅读 · 0 评论 -
JAVA多线程之——CopyOnWriteArraySet
CopyOnWriteArraySetCopyOnWriteArraySet是一个线程安全的HashSet.但是它们的实现并不相同。HashSet是基于散列列表实现的。而CopyOnWriteArraySet的底层实际上是一个CopyOnWriteArrayList.也就是说基于动态数组实现。 在其保证线程安全上跟CopyOnWriteArrayList的机制是一样的。但是因为set集合是不允许重原创 2017-04-03 14:46:35 · 376 阅读 · 0 评论 -
JAVA多线程之——并发包JUC——Atomic
前面学习了基础的多线程知识。今天开始学习JAVA的并发包java.util.concurrent。java并发包包括 java.util.concurrent、java.util.concurrent.atomic、java.util.concurrent.locks包。今天开始学习atomic包下的内容’ 概念 java从jdk1.5开始引入了并发包。其中java.util.concurren原创 2017-03-26 23:02:49 · 3254 阅读 · 0 评论 -
JAVA多线程之——ConcurrentHashMap
ConcurrentHashMap学习了ArrayList与HashSet相对应的线程安全的CopyOnWriteArrayList 与CopyOnWriteArraySet之后,今天学习HashMpa对应的线程安全集合ConcurrentHashMap. HashMap是线程不安全的,HashTable是线程安全的。但是HashTable是通过Synchronized进行同步的,这就导致一个线程原创 2017-04-03 16:39:01 · 288 阅读 · 0 评论 -
JAVA多线程之——ArrayBlockingQueue
ArrayBlockingQueueArrayBlockingQueue队列是BlockingQueue的一个子类.block是阻塞的意思。它是一个阻塞队列,array说明它的底层是基于数组实现。数组是有大小的,所以它是一个有(边)界的队列。综上,ArrayBlockingQueue是一个有界的阻塞队列。 BlockingQueue BlockingQueue接口有三个删除方法和三个添加方法原创 2017-04-03 22:47:44 · 596 阅读 · 0 评论 -
JAVA多线程之——LinkedBlockingQueue
LinkedBlockingQueueLinkedBlockingQueue队列跟ArrayBlockingQueue一样都实现了BlockingQueue。因此同样是阻塞队列,有三种删除和三种添加的方法。LinkedBlockingQueue的底层是基于链表实现。ArrayBlockingQueue通过一个锁和锁的两个条件对象保证并发的安全性,LinkedBlockingQueue通过两个锁和每个原创 2017-04-04 13:55:45 · 962 阅读 · 0 评论 -
JAVA多线程之——ConcurrentLinkedQueue
ConcurrentLinkedQueueConcurrentLinkedQueue是一个非阻塞的无界队列。非阻塞和阻塞区别。首先了解一下JAVA中多线程的同步机制基本采用三种方式:volatile 轻量级的线程同步,不会引起上下文的切换和线程调度,提供内存的可见性,但不保证原子性。CAS 轻量级的线程同步,不会引起上下文的切换和线程调度,提供内存的可见性和原子性。内部锁(synchro原创 2017-04-04 18:17:02 · 483 阅读 · 1 评论 -
JAVA多线程之——CountDownLatch
CountDownLatch在学习线程基本知识的时候,学习过一个线程的join方法,该方法就是让当前线程等待,直到当前线程中调用了join方法的线程执行完毕,再执行本线程。加入在导入一个Excel的时候,有多个sheet,那么可能我们就考虑用多个线程分别读取sheet然后保存数据库,再记录日志,然后通知用户导入成功。先看join实现:public class JoinTest {public sta原创 2017-04-05 19:57:25 · 573 阅读 · 0 评论 -
JAVA多线程之——CyclicBarrier
CyclicBarrierCyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。 CountDownLatch是某一个线程等待一个或者N个线程。 主体不同,CountDownLatch的主体是某一个线程。它是要一个或者多个线程完成某一个动作之后自己执行。这些线程互相之间是不等待的。 CyclicBaarier 主体是N个线程,就是说大家在某一个点上互相等原创 2017-04-05 20:39:42 · 312 阅读 · 0 评论 -
JAVA多线程之——Semaphore
Semaphore一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。 其实Semaphore就是维护了一个共享锁,通过state来决定同时可以多少个线程获取原创 2017-04-05 22:00:52 · 408 阅读 · 0 评论 -
JAVA多线程之——线程池
线程池线程池顾名思义,就是一个放置线程的池子。就跟数据库连接池差不多。线程池通过对并发线程的控制,能有效的节省系统资源的浪费,提高系统的性能。 学习线程池,先了解一下线程池的一个基本结构: Executorpublic interface Executor { void execute(Runnable command);}Executor是一个接口,其中只有一个方法,就是execu原创 2017-04-06 21:42:59 · 317 阅读 · 0 评论 -
JAVA多线程之——线程中断
概要 已经学习了线程的状态有五种,新建、就绪、运行、阻塞、死亡。一般情况下,我们都是让线程运行完毕之后,自动死亡。但是有时候我们需要在线程运行的过程中,终止线程的工作。那么该怎么做呢?JAVA提供了一种中断机制。首先看一下Thread类中关于线程中断有关的的方法public static boolean interrupted: 测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如原创 2017-03-25 18:22:44 · 537 阅读 · 0 评论 -
JAVA多线程之——volatile关键字
概要 volatile关键字主要作用是使变量在多个线程之间可见。 在线程工作的时候,每个线程都会有自己的一个内存区域,这个区域保存了主内存中线程需要用到的一些变量和引用。当多个线程访问一个没有同步的变量时候,每个线程自己内存中的变量对于其它线程是不可见的。如图: 图中线程1与线程2的count变量是互不可见的。 但是,当一个变量如果被volatile修饰之后。那么多个线程之间对于这个变量原创 2017-03-25 13:39:22 · 367 阅读 · 1 评论 -
JAVA并发编程实战——对象组合
4.1 设计线程安全的类 在设计线程安全类的过程中,需要包含以下三个基本要素: 1.找出构成对象状态的所有变量。 2.找出约束状态变量的不变性条件(找出这些条件,然后对这些条件进行并发策略管理,使其线程安全) 3.建立对象状态的并发访问管理策略。 以上三条理解为:先找出所有具有不变性条件的变量,然后确定这些变量的不变性条件是什么,再对这些不变性条件进行并发访问策略管理(原创 2016-12-21 23:51:51 · 466 阅读 · 0 评论 -
JAVA并发编程实战 ——线程安全性
以前也算是看过并发编程实战这本书。但是一直做的是书中的笔记。如今从头看此书。希望把笔记记录成博客。以便以后查询。怎么确定一个类是线程安全的: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要添加额外的同步或者协同。这个类都能表现出正确的行为,那么就称这个类是线程安全的。 2.2.1:无状态对象一定是线程安全的 在本书中描述是:既原创 2016-12-19 23:04:36 · 433 阅读 · 0 评论 -
JAVA多线程之——自旋锁、CLH、MCS
自旋锁学习了解自旋锁之前先回顾一下互斥锁 互斥锁 线程在获取互斥锁的时候,如果发现锁已经被其它线程占有,那么线程就会惊醒休眠,然后在适当的时机(比如唤醒)在获取锁。 自旋锁 那么自旋锁顾名思义就是“自旋”。就是当一个线程在尝试获取锁失败之后,线程不会休眠或者挂起,而是一直在循环检测锁是否被其它线程释放。 区别 互斥锁就是开始开销要大于自旋锁。临界区持锁时间的大小并不会对互斥锁的开销造成影原创 2017-03-28 22:38:02 · 2591 阅读 · 0 评论 -
JAVA多线程之——常用线程池
线程池学习了线程池的基本原理后,可以理解线程池的类型控制,主要是通过中心池大小,和最大线程池大小,以及存储工作任务的队列决定。JDK中为我们封装了常用的四种线程池。 在JDK帮助文档中,有如此一段话: “强烈建议程序员使用较为方便的Executors工厂方法Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、Executors.newFixedTh原创 2017-04-08 13:40:19 · 419 阅读 · 0 评论 -
JAVA多线程之——线程通信 Condition
线程的通信 前面学习了用wait/notify的方式进行线程通信。今天学习一种更加强大的线程通信方式Condition.Condition的强大之处就是可以为线程建立不同的Condition。然后可以唤醒任意指定阻塞的线程。Condition之所以能为一个线程建立不同的Condition,是因为它也维护着一个阻塞的条件队列。它跟AQS等待队列通过线程的等待、唤醒建立关系。 1.每当AQS队列中的原创 2017-03-29 23:26:23 · 441 阅读 · 0 评论 -
JAVA多线程之——Future与Callable
Futrue与Callable在学习了多线程之后,可以知道线程的实现方式是通过继承Thread或者实现Runnable接口,当线程被启动后,会执行run方法。都知道run方法是一个void方法,也就是说线程执行完毕之后,不会返回任何东西。那么,如果我们想得到线程执行的结果怎么呢?这就要用到JUC中的Futrue与Callable了。 Callable public interface Callab原创 2017-04-08 17:29:51 · 342 阅读 · 1 评论 -
JAVA多线程系列之基本概念
线程状态图:线程共包括五种状态: 1.新建状态(new):一个线程创建后,就进入新建状态。 2.就绪状态(Runnable) :就绪状态也叫“可执行状态”。当一个线程处于新建状态时,就可以通过调用该线程的start()方法启动该线程,这个时候线程就处于可执行状态——随时可以被CPU调度执行 3.运行状态(Running):线程获取CPU的权限进行执行。线程只能通过可执行状态进入执行状态转载 2017-03-23 13:17:25 · 221 阅读 · 0 评论 -
JAVA多线程之——线程的实现方式
内容转载:http://www.cnblogs.com/skywang12345/p/3479063.html概要 本章我们学习多线程的两种常用实现方式:继承Thread类与实现Runnable接口。 此外我们还可以通过JUC(java.util.concurrent)中的线程池来实现。本章内容包括: Thread与Runnable简介 Thread 是一个转载 2017-03-23 23:39:58 · 239 阅读 · 0 评论 -
JAVA多线程之——Thread中start()和run()的区别
参考原文:http://www.cnblogs.com/skywang12345/p/3479083.html 线程的启动 上一节中说到,传统的线程可以通过继承Thread类和实现Runnable接口来实现。那么当我们需要一个线程运行的时候。这两种方式又是分别如何运行的呢?1.Thread 类的start() 方法。public class ThreadTest { public sta原创 2017-03-24 16:14:30 · 1049 阅读 · 0 评论 -
JAVA多线程之——同步与异步
线程的同步与异步 1.同步:synchronized. 同步从概念上来讲,就是一个资源的共享。因此在多线程环境中,重点就是共享,如果一个资源没有被共享,则不需要同步。 2.异步:asynchronized 异步就是在多线程环境中,多个线程可以同时访问某一个资源。而不需要竞争。相互独立。就像我们的ajax异步刷新。在刷新某个局部的时候,并不影响你进行其他操作。Synchronize原创 2017-03-24 21:48:53 · 938 阅读 · 0 评论 -
JAVA多线程之——脏读
脏读 上节学习了同步与异步。那么在应用中同步异步的应用时候,设计程序时候,一定要注意业务的整体性。也就是要注意上节学的资源的共享,则一定要同步。不然就会发生错误。比如经典的脏读(dirtyread) 先来看一下示例代码:public class Dirtyread { private String userName="pdz"; private String password="原创 2017-03-24 22:29:40 · 5287 阅读 · 0 评论 -
JAVA多线程之——线程之间的通信
概要 我们知道线程是操作系统中一个独立的个体,在一般多线程环境下,我们希望的是各个线程之间有一定的关联,使得各个线程组合成一个整体工作。那么就必须要使线程之间互相能传递信息。这就是线程之间需要通信。线程通信可以采取wait/notify 方法实现通信(当然还有其它通信方式。这节只学习wait/notify 方法)。wait/notify定义 1.wait/notify方法定义在Object类中。原创 2017-03-25 10:45:22 · 333 阅读 · 0 评论 -
JAVA多线程之——wait/yield/sleep/join方法的区别
概念 wait wait()定义在Object中。wait()会释放锁。wait()让当前线程从运行状态到就绪状态。sleep 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。 例如有两个线程同时执行(没有synchronized)一个线程优先级为转载 2017-03-25 11:13:43 · 589 阅读 · 0 评论 -
JAVA多线程之——互斥锁ReentrantLock
ReentrantLock简介 首先回顾一下synchronized关键字。 把代码声明为synchronized之后,那么就会保证,每次都只有一个线程获取对象的内部锁,进而产生互斥保证共享资源的安全。synchronized是获取对象的内部锁,所以是原生语法层面的互斥,需要JVM实现。 ReentrantLock是jdk1.5开始引入的JUC并发包中的一个类,ReentrantLock基于j原创 2017-03-27 23:16:27 · 864 阅读 · 0 评论