
并发编程
文章平均质量分 85
另一只羊
这个作者很懒,什么都没留下…
展开
-
Java多线程(三)
什么会引起Java线程阻塞?join()sleep()Daemon Thread线程的优先级yield()原创 2017-05-04 22:10:18 · 271 阅读 · 0 评论 -
Java并发编程:认识线程组
可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。一、线程关联线程组:1级关联所谓1级关联就是父对象中有子对象,但并不创建孙对象。这种情况在开发中很常见,比如创建一些线程时,为了有效对这些线程进行组织管理,通常情况下是创建一个线程组,原创 2017-07-03 15:28:17 · 453 阅读 · 1 评论 -
Java并发编程:中断机制
之前讲解Thread类中方法的时候,interrupt()、interrupted()、isInterrupted()三个方法没有讲得很清楚,只是提了一下。现在把这三个方法同一放到这里来讲,因为这三个方法都涉及到多线程的一个知识点—-中断机制。Java没有提供一种安全、直接的方法来停止某个线程,而是提供了中断机制。中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自原创 2017-07-03 15:55:59 · 418 阅读 · 0 评论 -
Java并发编程:线程池
ThreadPoolExecutor 深入分析java线程池的实现原理 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以原创 2017-07-03 17:43:16 · 335 阅读 · 0 评论 -
Java并发编程:Callable、Future和FutureTask
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。一.Call原创 2017-07-04 22:57:26 · 251 阅读 · 0 评论 -
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore。一.CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLa原创 2017-07-04 23:31:21 · 316 阅读 · 0 评论 -
Java并发编程:阻塞队列
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedLi转载 2017-06-15 10:52:39 · 288 阅读 · 0 评论 -
Java并发编程:synchronized
synchronized原创 2017-05-05 16:04:50 · 319 阅读 · 0 评论 -
Java并发编程:Lock
在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?LockReentrantLock可重入锁公平锁读写锁原创 2017-05-06 00:26:44 · 305 阅读 · 0 评论 -
ConcurrentHashmap 解析
一、Collections.synchronizedMap(new HashMap())HashMap:允许null值(key/value)。 Hashtable:不允许null值。 /** * Returns a synchronized (thread-safe) map backed by the specified * map. In order to guarant原创 2017-06-14 10:52:31 · 420 阅读 · 0 评论 -
Java并发编程:同步容器、并发容器和阻塞队列
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。一.为什么会出现同步容器在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,必须要求程序员手动地在任何访问到这些容器的地方进行同步原创 2017-07-02 16:51:21 · 1304 阅读 · 0 评论 -
Java ConcurrentModificationException异常原因和解决方法
在前面一篇文章中提到,对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解转载 2017-06-13 16:24:21 · 2283 阅读 · 1 评论 -
Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资原创 2017-07-01 23:21:17 · 386 阅读 · 0 评论 -
Java多线程(一)
进程线程并行并发线程的生命周期和基本状态五种基本状态多线程的创建与启动的几种方式原创 2017-05-04 11:29:40 · 521 阅读 · 1 评论 -
Java多线程(二)
后台线程后台(daemon)线程创建与启动线程的几种方式原创 2017-05-04 21:41:38 · 211 阅读 · 0 评论 -
Java多线程(四)
线程安全synchronized同步代码块同步锁对象wait()/notify()/noitifyAll()原创 2017-05-04 22:34:29 · 241 阅读 · 0 评论 -
Java多线程总结
进程和线程 一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程拥有自己的栈空间。使用多线程可以减少程序的响应时间。与进程相比,线程的创建和切换开销更小。多CPU或多核计算机本身就有执行多线程的能力。同步和异步同步机制确保资源的安全性。 synchronized是以系统开销作为代价的,有时候甚至可能造成死锁。原创 2017-05-04 23:48:27 · 231 阅读 · 0 评论 -
Java并发编程:如何创建线程?
在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认为java.exe或者javaw.exe(windows下可以通过任务管理器查看)。Java采用的是单线程编程模型,即在我们自己的程序中如果没有主动创建线程的话,只会创建一个线程,通常称为主线程。但是要注意,虽然只有一个线程来执行任务,不代表JVM中只有一个线程,JVM实例在创建的时候,同时会创建很多其他的线程原创 2017-05-05 13:53:06 · 326 阅读 · 0 评论 -
Java并发编程:进程和线程之由来
进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。一个进程包括多个线程,这些线程是共享进程占有的资源和地址空间的。进程是操作系统进行资源分配的基本单位,线程时操作系统进行调度的基本单位。多线程是共享进程的资源和地址空间的,所以就会有同步问题。进程和线程之由来原创 2017-05-05 13:29:08 · 227 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
volatile解析Java内存模型在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。那么Java内存模型规定了哪些东西呢,它定义了程序中变量的访问规则,往大一点说是定义了程序执行的次序。注意,为了获得较好的执行性能,Java内存模型并没有限制执行引擎原创 2017-05-07 21:57:53 · 401 阅读 · 0 评论 -
死锁
当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞,这个我们都知道。如果线程A持有锁L并且想获得锁M,线程B持有锁M并且想获得锁L,那么这两个线程将永远等待下去,这种情况就是最简单的死锁形式。在数据库系统的设计中考虑了监测死锁以及从死锁中恢复,数据库如果监测到了一组事物发生了死锁时,将选择一个牺牲者并放弃这个事物。Java虚拟机解决死锁问题方面并没有数据库这么强大,当原创 2017-06-30 00:02:02 · 321 阅读 · 0 评论 -
Java并发编程:wait()和notify()/notifyAll()
线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作。想像一个场景,A线程做ArrayList的add操作,B线程等待ArrayList的大小到了100000就给出反应,怎么处理?一个办法就是,B线程轮询检查ArrayList的大小,这样两个线程之间就有了通信。package com.mook.wait;import java.util.ArrayLis原创 2017-06-30 00:57:39 · 341 阅读 · 0 评论 -
Java并发编程:深入剖析ThreadLocal
一. 对ThreadLocal的理解import java.util.Date;import java.util.concurrent.TimeUnit;class UnsafeTask implements Runnable{ private Date startDate; @Override public void run() { startDate =原创 2017-05-08 22:37:30 · 351 阅读 · 0 评论 -
Java并发编程:Thread类的使用
Thread类sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象。看下面这个例子就清楚了:public class Test { private int i = 10; private Object object = new Object();原创 2017-05-05 14:27:57 · 624 阅读 · 1 评论