Java并发学习笔记
joker_zhou
这个作者很懒,什么都没留下…
展开
-
Java并发学习笔记(1) 线程与进程
线程和进程: 线程又称为轻量级进程,和进程一样拥有独立的执行控制,由操作系统进行调度.区别是线程没有独立的存储空间,而是和所属进程中的其他线程共享一个存储空间,所以线程之间的通信较进程简单. 多线程大多时间我们不是在使用多个线程而是维护多个线程之间的协作.比如数据共享.原创 2012-03-05 21:26:12 · 565 阅读 · 0 评论 -
Java并发学习笔记(6)线程的四种状态,优先级
线程的四种状态 1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。 2. 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。 3. 死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。 4. 阻塞状态:线程不会原创 2012-03-05 22:08:46 · 1618 阅读 · 0 评论 -
Java并发学习笔记(10)线程同步容器
容器的遍历,这是个非常费时的同步,如果不同步可能会发出异常,因为你在检查后的第一时间不是输出这个值,而是由其他线程在你的容器内移除最后一个元素,而你正在为输出取得这个元素时就回得到一个异常.但是把整个遍历容器加锁后.其他增删改操作将在很长一段时间内无法进行,这严重影响了其他操作使其他操作无响应. 简单的解决就是复制容器只在取得容器的部分加上同步.这样虽然开销大于以前,但是可以抽出cpu时间交给其他原创 2012-03-06 12:52:18 · 933 阅读 · 0 评论 -
Java并发学习笔记(11)阻塞线程
阻塞指的是暂停一个线程的执行以等待某个条件发生.java实现阻塞的方式如下几种: (1) 调用Thread.sleep()方法它已毫秒作为单位让该线程睡眠一段时间,到时间后会自行唤起线程.也可以使用TimeUnit.XX.sleep() XX是TimeUnit的常量代表休眠的时间单位具体查看JDK即可. (2) 使用Thread的suspend() 和 resume() 方法 不过使用susp原创 2012-03-06 12:53:31 · 484 阅读 · 0 评论 -
Java并发学习笔记(14) 闭锁(CountDownLatch)
闭锁工作就像一道门,在门关闭的时候没有线程能通过,只有在门开时线程才会通过. (1)CountDownLatch a) java中CountDownLatch类就是实现闭锁的工具,在其内有一个计数器(使用构造初始),当使用CountDownLatch的await方法会使当前线程阻塞,countDown会递减内部的计数,当计数为0的时候,所有CountDownLatch阻塞的线程才会一起开始原创 2012-03-06 13:05:32 · 1173 阅读 · 0 评论 -
Java并发学习笔记(8)发布逸出
发布逸出 (1)发布:发布是指将一个对象,使其引用储存到一个其他代码可以访问到的地方,在一个非私有方法返回这个引用,也可以把它传递到其他对象中. a) 发布最简单的就是将对象设置到公共静态域中 b) 发布第二种简单的方式就是在一个公共方法内直接return 对象的引用 第三种的发布就很隐秘了.就是讲自身的对象引用发布到另一个对象的引用中. 可能在构造中出现如此这就是this原创 2015-10-16 10:32:00 · 317 阅读 · 0 评论 -
Java并发学习笔记(12)避免活跃度危险(死锁)
首先明确一点Java是无法从死锁状态中恢复的. (1)线程锁死的条件: a) 线程存在互斥 b) 至少有一个任务必须持有资源且正在等待获取一个当前被别的任务持有的资源 c) 资源不能被任务抢占,任务必须把资源释放当做普通事件. d) 线程之间互相等待 (2)实例: a) 一个单线程池,一个任务将另一个任务提交到同一个线程池中.并且等待另一个任务的结果原创 2015-10-16 10:34:12 · 534 阅读 · 0 评论 -
Java并发学习笔记(14) 闭锁(CountDownLatch)
闭锁工作就像一道门,在门关闭的时候没有线程能通过,只有在门开时线程才会通过. (1)CountDownLatch a) java中CountDownLatch类就是实现闭锁的工具,在其内有一个计数器(使用构造初始),当使用CountDownLatch的await方法会使当前线程阻塞,countDown会递减内部的计数,当计数为0的时候,所有CountDownLatch阻塞的线程才会一起原创 2015-10-16 10:35:01 · 337 阅读 · 0 评论 -
Java并发学习笔记(6)线程的四种状态,优先级
线程的四种状态 1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。 2. 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。 3. 死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。 4. 阻塞状态原创 2015-10-16 10:21:24 · 540 阅读 · 0 评论 -
Java并发学习笔记(1) 线程与进程
线程和进程: 线程又称为轻量级进程,和进程一样拥有独立的执行控制,由操作系统进行调度.区别是线程没有独立的存储空间,而是和所属进程中的其他线程共享一个存储空间,所以线程之间的通信较进程简单. 多线程大多时间我们不是在使用多个线程而是维护多个线程之间的协作.比如数据共享. ...原创 2012-03-28 20:07:59 · 72 阅读 · 0 评论 -
Java并发学习笔记(2)在java中实现多线程的启动
直接继承Thread类 直接继承Thread类并且覆盖重写run方法,然后new出此类使用start方法启动线程如下: [java] view plaincopyprint? public classMyThread extends Thread { @Override public void run() { ...原创 2012-03-28 20:08:38 · 73 阅读 · 0 评论 -
Java并发学习笔记(3)线程池的配置
(1)线程池的大小:N=cpu数量,U=目标cpu的使用率,W/C等待时间与计算时间比率 线程池大小=N*U*(1+W/C) Runtime.getRuntime().availableProcessors()得到CPU数量 ...原创 2012-03-28 20:09:17 · 81 阅读 · 0 评论 -
Java并发学习笔记(4)线程的取消,关闭和异常终止
首先,要说的是java中没有一种停止线程的方法是绝对安全的. 线程的中断 Thread.interrput()方法很容易给人一种误会,让人感觉是一个线程使另外一个正在运行的线程停止工作,但实际上interrput仅仅传递了请求中断的信息.线程自己会在下一个方便的时间中断.某些操作会接受这个请求时发出一个异常,比如wait,sleep.每一个Thread线程都有一个中断状态,是boolea...原创 2012-03-28 20:09:40 · 105 阅读 · 0 评论 -
并发巧门(转自:JAVA并发编程实践)
(1)并发问题都归结为如何协调并发状态.可变状态越少,保证线程安全就越容易. (2)尽量将域声明为final类型,除非他们的需要是可改变的 (3)不可变对象天生是线程安全的. 不可变对象极大的减轻了并发编程的压力,他们简单而且安全.可以再没有锁货 防御性复制的情况下自由的共享发布 (4)封装使管理复杂度变得更可行. (5)用锁来保每一个可变变量(此变量为多线程共享) (6原创 2012-03-06 13:21:24 · 1456 阅读 · 0 评论 -
Java并发学习笔记(2)在java中实现多线程的启动
(1)直接继承Thread类 直接继承Thread类并且覆盖重写run方法,然后new出此类使用start方法启动线程如下: public classMyThread extends Thread { @Override public void run() { while(true) { System.out.println原创 2012-03-05 21:41:03 · 1510 阅读 · 0 评论 -
Java并发学习笔记(5)停止基于线程的服务
基于线程的服务,典型的就属于线程池了.这些服务通常的一点是,它们存在的时间通常比创建它们的方法存在的时间更久一些. 程序拥有服务,服务拥有线程,但是程序并不一定拥有线程,因此程序不应该试图直接停止服务中的线程.所以服务应该提供控制其内部线程的生命周期的方法.(如同线程池ExecutorService的shutdown/shudownNow),不要发布线程给程序.让程序多管闲事. 对于线程持有的原创 2012-03-05 22:03:52 · 900 阅读 · 0 评论 -
Java并发学习笔记(12)避免活跃度危险(死锁)
首先明确一点Java是无法从死锁状态中恢复的. (1)线程锁死的条件: a) 线程存在互斥 b) 至少有一个任务必须持有资源且正在等待获取一个当前被别的任务持有的资源 c) 资源不能被任务抢占,任务必须把资源释放当做普通事件. d) 线程之间互相等待 (2)实例: a) 一个单线程池,一个任务将另一个任务提交到同一个线程池中.并且等待另一个任务的结果,这就发生死锁原创 2012-03-06 12:57:45 · 686 阅读 · 0 评论 -
Java并发学习笔记(17)性能,分离锁
多线程往往比单线程开销要大,这包括加锁释放锁,信号,同步,切换,线程的创建销毁,调度. (1)如何优化性能: 如果重复计算量大的话,使用缓存来保存旧的结果.以便下次计算时使用. 减少阻塞.运行和阻塞会增加上下文切换. 因为锁是串行的这会引起大量的阻塞:所以我们在使用锁的时候要尽量的做到以下几点: i原创 2012-03-06 13:15:54 · 3320 阅读 · 0 评论 -
Java并发学习笔记(3)线程池的配置
(1)线程池的大小:N=cpu数量,U=目标cpu的使用率,W/C等待时间与计算时间比率 线程池大小=N*U*(1+W/C) Runtime.getRuntime().availableProcessors()得到CPU数量原创 2012-03-05 21:51:35 · 4955 阅读 · 0 评论 -
Java并发学习笔记(9)组合对象的安全同步
大多数类都是由其他类组合起来的。所以组合后的类是否是同步安全的有时候会让人很迷惑。 (1)设计线程安全的类 a) 确定对象状态由哪些变量构成 b) 确定限制状态变量的不变约束 c) 制定管理并发访问对象状态的策略. (2)数据限制为private,访问对象的方法设置为同步的可以有效的确保线程安全,且不要将数据发布到其他非线程安全的类中.发布到期望可用的范围内. (3)Java监视原创 2012-03-05 22:27:09 · 610 阅读 · 0 评论 -
Java并发学习笔记(15)信号量(Semaphore) 关卡((2)CyclicBarrier)
信号量 (1)计数信号量可以控制同时访问某特定资源的活动数量,或者同时执行某一给定操作的数量. a) 信号量可以实现资源池(线程池)和规定无界容器的边界 b) 信号量为1的可以作为特定线程的互斥锁 (2)Java使用Semaphore类作为信号量类,acquire可以获取一个或多个量,release可以归还一个或者多个量 关卡 (1)关卡类似闭锁,但是关卡是需要所有线程到达原创 2012-03-06 13:09:37 · 1027 阅读 · 0 评论 -
Java并发学习笔记(16)守护线程,线程组
守护线程 守护线程是指不是程序的核心线程意思是,如果所有非守护线程停止后核心线程也将终止,核心线程,守护线程一般作为后台线程为其他线程提供服务的. 判断是否为核心线程调用isDaemon()方法判断. 设置线程为守护线程使用setDaemon()方法 记住守护线程派生出来的子线程也为守护线程 线程组 线程组是一个Ja原创 2012-03-06 13:11:52 · 633 阅读 · 0 评论 -
Java并发学习笔记(4)线程的取消,关闭和异常终止
首先,要说的是java中没有一种停止线程的方法是绝对安全的. 线程的中断 Thread.interrput()方法很容易给人一种误会,让人感觉是一个线程使另外一个正在运行的线程停止工作,但实际上interrput仅仅传递了请求中断的信息.线程自己会在下一个方便的时间中断.某些操作会接受这个请求时发出一个异常,比如wait,sleep.每一个Thread线程都有一个中断状态,是boolean型的原创 2012-03-05 21:56:50 · 3680 阅读 · 0 评论 -
Java并发学习笔记(7)线程的同步 (锁)
如果数据是非原子性操作,那么必须实现线程的同步化. 在多线程的程序中,不建议使用惰性初始化(检查在运行) 比如if(XX==null){return new XX}这种操作. PS:原子操作:指的是单独的,不可分割的操作去执行.比如A线程和B线程,从A线程的角度来看,当其他线程执行B线程的时候,要么B完全执行完,要么一点都没有执行;在java中 i++这种操作并不是原子性的,它分为3个步骤完成原创 2012-03-05 22:14:36 · 726 阅读 · 0 评论 -
Java并发学习笔记(8)发布逸出
发布逸出 (1)发布:发布是指将一个对象,使其引用储存到一个其他代码可以访问到的地方,在一个非私有方法返回这个引用,也可以把它传递到其他对象中. a) 发布最简单的就是将对象设置到公共静态域中 b) 发布第二种简单的方式就是在一个公共方法内直接return 对象的引用 第三种的发布就很隐秘了.就是讲自身的对象引用发布到另一个对象的引用中. 可能在构造中出现如此这就是this例如:原创 2012-03-05 22:19:39 · 2478 阅读 · 0 评论 -
Java并发学习笔记(13)线程之间的协作(Object.wait(),notifu(),notifyAll() Thread.join())
(1)wait(),notify(),notifyAll() a) 前面已经介绍三个方法的用法和作用,wait还有个重要的作用就是在挂起线程的时候释放对象锁.这样可以使其他线程获得释放掉的锁. (2)join() a) 一个线程在另一个线程调用join那么另一个线程需要等待第一个线程完成后才可以继续运行 (3)线程之间的通信 a) 线程之间的通信可以使用管道流进行交互: i原创 2012-03-06 13:02:20 · 964 阅读 · 0 评论 -
Java并发学习笔记(5)停止基于线程的服务
首先,要说的是java中没有一种停止线程的方法是绝对安全的. 线程的中断 Thread.interrput()方法很容易给人一种误会,让人感觉是一个线程使另外一个正在运行的线程停止工作,但实际上interrput仅仅传递了请求中断的信息.线程自己会在下一个方便的时间中断.某些操作会接受这个请求时发出一个异常,比如wait,sleep.每一个Thread线程都有一个中断状态,是boolea...原创 2012-03-28 20:10:09 · 77 阅读 · 0 评论