JAVA-多线程
文章平均质量分 59
iteye_21194
这个作者很懒,什么都没留下…
展开
-
jconsole & visualvm 监控java进程
jconsole 和 visualvm 监控java进程状态:包括: cpu使用,线程状态,内存使用情况等。 jconsole 是java 自带的程序,在java_home/bin目录下,启动需要监控的程序后,双击jconsole 打开, 选择你要监控的JAVA进程,点击连接,提示: 点击“不安全”进入 vi...原创 2015-06-13 09:57:24 · 152 阅读 · 0 评论 -
线程数
增加线程数可以提高应用的处理能力,但线程数过多,CPU频繁切换线程会影响性能。 最好的状态是一直使CPU一直保执忙碌状态,如果主机上有两颗四核CPU,那么至少需要8条线程,才能充分利用CPU,如果线程中有阻塞等待,就需要更多的线程供CPU调度执行,否则CPU闲置,如果线程执行相同的任务,阻塞时间与执行时间相等,那么就需要8*2=16条线程。即(阻塞时间/线程...原创 2013-11-14 00:01:19 · 87 阅读 · 0 评论 -
CountDownLatch
CountDownLatch 用于阻塞一条或多条线程,直至其它线程把工作完成。 构那建器: CountDownLatch(int count);count为计数器 方法:await() 调用await方法的线程在计数器=0前一直阻塞,除非线程被中断。 countDown() 将计数器count-1,如果计数到达零,...原创 2013-11-14 22:01:30 · 59 阅读 · 0 评论 -
线程池
个人学习笔记,如有错误欢迎指正。。 一 线程池的介绍 如果需要线程来执行的任务,可以使用 new Thread 来创建线程,Thread.start()方法执行线程,线程执行完之后,不可再利用。还有其它任务需要线程来执行,需要重复上述步骤。 这样就形成,一个任务创建一条线程来执行,对于大量任务来说,频繁创建和销毁线程都需要耗费系统资源,这种情况可以...原创 2013-11-29 00:09:26 · 68 阅读 · 0 评论 -
AtomicReference
个人学习笔记,如有错误欢迎指正。。 AtomicReference 提供了原子的方式更新对象引用。用于多线程之间。 对象的引用赋值本身就是原子的。如:共享变量Object o ; 线程A 执行 :o = "x";//原子的线程安全 线程B 执行 o = new Integer(12);//原子的线程安全 那么为什么要使用 AtomicReference 呢...原创 2013-12-02 22:41:32 · 81 阅读 · 0 评论 -
信号量Semaphore
个人学习笔记,如有错误欢迎指正。。 信号量Semaphore ,一般用于限制对某些资源固定数量的访问。 Semaphore维护了N个的许可,某线程通过acquire()获取一个许可或acquire(int permits) 获取多许可,如果许可数量N大于线程要求的许可数,线程得到许可并可以继续执行。否则线程阻塞,等待某线程释放许可。某线程释放许可,许可数量增加并唤醒被阻...原创 2013-12-02 22:42:32 · 76 阅读 · 0 评论 -
Exchanger
个人学习笔记,如有错误欢迎指正。。 Exchanger 用于两个线程之间进行数据或对象交换(通信),是线程安全的。 方法:public V exchange(V x) A线程调用该方法时阻塞,直至另外一个线程B调用同一个Exchanger实例 的exchange方法,B线程的exchange方法获取A线程的调用参数,并唤醒A线程,再返回A线程的调用参数,...原创 2013-12-02 22:48:29 · 73 阅读 · 0 评论 -
CyclicBarrie
个人学习笔记,如有错误欢迎指正。。 CyclicBarrier 类用于阻塞一个或多个线程,等待其它线程完成任务,直至所有线程都完成各自的任务,才会解除阻塞继续执行。 构建器 CyclicBarrier (int n,Runnable runnable) await()方法被调用时,计数器N减一,如果计数据N>0,则当前线程阻塞,如果计数器N==0时,...原创 2013-12-02 22:50:33 · 134 阅读 · 0 评论 -
锁的使用
锁用于解决多线程对共享资源的同时访问,而引起的非线程安全问题:某一时该只有一条线程可以访问共享资源,达到了线程安全的目的,但同时也限制了并发处理的速度。 锁的分类:同步锁: synchronized 是java 内置的语法可重入锁:ReentrantLock 是一个java类读写锁:ReentrantReadWriteLock 是一个java类 锁定的范围:...原创 2014-03-11 15:08:48 · 151 阅读 · 0 评论 -
线程安全
线程安全对象:局部变量--在线程栈内,单个线程私有,是线程安全的。 不可变对象 --实例化(或发布后)状态不变,即使多线程访问也是线程安全的。 单个线程内的对象:只有一个线程访问,是线程安全的。如ThreadLocal保存的对象。 ...原创 2016-08-31 09:48:21 · 84 阅读 · 0 评论 -
ReentrantReadWriteLock
多线程中对某些共享变量进行读写操作,并发读操作时不会产生问题,并发读写或并发写操作会引起线程安全性问题。下面代码会报错:java.util.ConcurrentModificationException public class TestReentrantReadWriteLock { volatile Map dataMap = new HashMap(); privat...原创 2013-11-14 00:00:20 · 74 阅读 · 0 评论 -
Condition
A线程在使用Lock获得锁的后,可能会由于某些条件不满足,而不能继续执行,需要等待条件满足时,可以使用 Condition,Lock接口有一个newCondition()方法实化Condition,调用 Condition.await()当前线程释放锁,进入阻塞状态,当B线程获得这个锁并使条件满足时,调用同一个Condition实例的notify或notifyAll方法时,A线程被唤醒,但并未...原创 2013-11-13 23:59:37 · 73 阅读 · 0 评论 -
JAVA 读取大量文件
需要写一个程序,对某个目录下7000多个文本文件读取,整个目录大小为100多G,文本文件一行为一条数据。 要求尽快读取完数据。 主机配置:24颗逻辑CPU,40G内存 初步设计是:采用24个线程的固定线程池, 目录读取任务:1个,负责目录内文件名的读取,读取后交给文件读取线程 文件读取任务: 11个,负责读取文件内容,即同...原创 2015-06-26 11:03:19 · 1212 阅读 · 0 评论 -
自旋锁的简单实现
public class AtomicStringBuilder { private AtomicReference<Thread> sign =new AtomicReference<Thread>(); StringBuilder sb = new StringBuilder(); public void lock(){ ...原创 2015-07-08 15:16:27 · 116 阅读 · 0 评论 -
atomic
Atomic 包中的类提供了对数据进行原子操作的功能。例如 a++ 、a+=1等类似代码不是原子的,实现过程是由内存中取出数据,对数据进行计算,再结果写入内存,属于复合操作,由多条CPU指令完成。 在单线程下这些代码会运行良好,如果a是多线程中的共享变量,那么运行结果可能会不正确。举列: a表示一个累计值,以a++为例: X线程 从内存中取出a的值=5,执行a++...原创 2013-11-11 09:54:39 · 73 阅读 · 0 评论 -
LockSupport
LockSupport 提供了使线程阻塞或恢复阻塞的方法。 LockSupport.park 使当前线程进入阻塞状态。LockSupport.unpark(Thread thread) 使参数指定的线程从阻塞状态进入可运行状态 park和unpark方法内部调用Unsafe类的本地方法实现了线程的阻塞与恢复。 ReentrantLock 和 ReentrantR...原创 2013-11-11 10:00:20 · 101 阅读 · 0 评论 -
原子性
原子性操作是指不可分割的操作,不能被线程调度暂停的操作。 具有原子性的操作: 1.变量的赋值(long,double类型数据除外,含对象的引用变量) 2.volatile 标记的 long,double 类型数据赋值原子性操作本身是线程安全的。 复合操作不具备原子性,如++1,value+=1,if(!map.containsKey(key))map.pu...原创 2013-11-11 10:05:34 · 104 阅读 · 0 评论 -
volatile
java 内存模型: 主内存:保存对象实例数据、数组等--对所有线程共享。 工作内存(缓存): 线程私有,线程执行时,从主内存获取变量副本,保存在工作内存,对其进行操作,操作完成之后再写入工作内存。 1.保证可见性 每条线程执行时都有有自己的工作内存,当对一个变量操作时,会从主内存中取出变量存入线程的工作内存,之后对该变量的读操作一直在...原创 2013-11-11 10:51:50 · 74 阅读 · 0 评论 -
Unsafe
一.CAS(compare and swap) Unsafe 用于实现CAS(compare and swap) 操作,基于CPU一条原始指令,是原子的线程安全的,可用于多线程间非阻塞方式实现线程安全。 多线程中如果有多个线程修改共享变量,一般使用synchronized ,只有一个线程获得锁可以修改,其它线程阻塞等待锁释放, Unsafe.compareAndSwapXXX 使用...原创 2013-11-11 10:56:31 · 71 阅读 · 0 评论 -
AbstractQueuedSynchronizer
AbstractQueuedSynchronizer 是多线程实现同步的基类,采用先进先出线程队列,队列中存有某些线程,这些线程由于某些状态或条件不满足(例如未获得锁)而进入阻塞状态,当条件满足时(例如持有锁的线程释放了锁)先入队列的阻塞线程被唤醒,它再次判断某些状态或条件是否满足而继续执行或再次进入阻塞状态。 AbstractQueuedSynchronizer 支持两种锁机制,...原创 2013-11-13 23:57:13 · 123 阅读 · 0 评论 -
ReentrantLock
ReentrantLock 是一个可重入的锁,用于线程之间的同步。 采用独占锁方式,即一个线程获得锁,其它线程需等待锁的释放。ReentrantLock与内置锁synchronized相比,多了: 1.lockInterruptibly() 获取锁的过程中 可以响应中断并返回假 2. tryLock(long timeout, TimeUnit unit) 获取锁的过程中,...原创 2013-11-13 23:58:34 · 112 阅读 · 0 评论 -
FutureTask
FutureTask 实现了Runnable,可由线程池执行run方法。FutureTask 实现了Future接口,表示一个异步的结果,线程池运行时run方法完成之前,get方法获取结果线程被阻塞,直到run方法执行完成,并设置结果,get线程被唤起,即可获得结果。 如果任务处理时间长,可使用线程池的submit方法提交Callable任务,立即返回FutureTask,Call...原创 2017-03-01 15:54:42 · 152 阅读 · 0 评论