
java并发编程
文章平均质量分 66
一直渣渣程序汪
Java 后台开发,菜鸟网络
展开
-
java synchronized内置锁
java提供了内置锁来支持原子操作,synchronized可以修饰静态方法,成员方法以及一段代码块。当线程调用同步方法或者同步代码块时,需要先获内置锁,调用结束释放这个锁之后其他线程才能接着获得锁并调用。synchronized修饰静态方法synchronized修饰静态方法时,获得的是Class对象的锁,与具体的实例对象的内置锁并不冲突。public class SynchronizedExam原创 2016-04-01 15:08:56 · 655 阅读 · 0 评论 -
java Lock(显示锁)
1.显示锁与内置锁对比内置锁在代码块调用结束后会自动释放锁,但是显示锁必须自己控制加锁和释放锁,因此使用显示锁更加危险(忘记释放锁)。内置锁不支持中断,阻塞的线程会一直等待直到拥有锁。而显示锁支持中断并且在处理锁的不可用问题上更加灵活(例如调用tryLock不会阻塞并且可以定时和轮询)。显示锁并不能代替内置锁,只有当内置锁不能满足需求是才可以考虑显示锁。内置锁要比显示锁更安全,内置锁作为JVM原创 2016-04-26 23:33:13 · 1515 阅读 · 0 评论 -
java CyclicBarrier
Barrier和CountDownLatch有些类似,它能阻塞一组线程直到某个事件发生,但是Barrier阻塞的这组线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待同组的其他线程。对应构造方法:CyclicBarrier(int parties)。parties对应阻塞的线程数量。Barrier还允许在所有线程都到达栅栏位置时,启动另外一个线程执行某些事情,等到这个线程执行原创 2016-04-13 17:13:55 · 327 阅读 · 0 评论 -
java Semaphore(信号量)
1.信号量用来累计唤醒的次数,从而不会产生notify信号丢失的问题。信号量也要指定初始信号的大小,acquire()方法将信号量的值减一,如果信号量的值小于等于零,那么调用线程会阻塞。而release()方法将信号量加一,并且不会产生阻塞。关键:信号量的取值,判断,修改以及可能发生的阻塞这一系列操作都是原子操作。2.信号量可以用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量,原创 2016-04-13 15:05:20 · 643 阅读 · 0 评论 -
java CountDownLatch(闭锁)
CountDownLatch的和join有类似之处,但是比join强大并且灵活许多。在实例化一个CountDownLatch时,需要设置一个初始计数,所有调用await()方法的线程都会阻塞直到计数减为零,countDown()方法每调用一次 ,计数减一直到减为零从而唤醒其他所有调用await()方法的线程。CountDownLatch的计数功能是一次性的,即它的计数减为零时,不能再重新设置它的原创 2016-04-12 20:35:07 · 294 阅读 · 0 评论 -
线程间协作:wait,notify,notifyAll,join,yield
wait1.wait,notify,notifyAll是Object类的方法。在使用时必须包含在synchronized方法中或者同步块中。即必须先获得正确的对象锁,调用wait后,会释放自己占有的锁并且加入到等待池中等待。直到有其他线程调用同一个对象的notify/notifyAll方法才会唤醒。如果在没有获得对象锁之前调用wait,notify,notifyAll会抛出IllegalMonito原创 2016-04-12 18:01:30 · 442 阅读 · 0 评论 -
阻塞方法与中断方法
1.线程可能在执行过程中阻塞或者暂停执行,例如等待IO结束,等待获得一个锁,等待从Thread.sleep方法中醒来,或者等待另一个线程的计算结果。2.阻塞方法:BlockingQueue的put和take方法会抛出收检查异常:InterruptedException。还有类似的方法如Thread.sleep。抛出InterruptedException的方法叫做阻塞方法。如果这个方法被中断,他将努原创 2016-04-12 11:48:25 · 4600 阅读 · 0 评论 -
java 线程创建的方法
这几天开始学习java并发编程实战,发现这本书理论知识很多,实践并不多,而且基本知识貌似默认大家是知道的。所以边看边学习一下基础知识。1.首先看下官方API文档的介绍:JVM允许在一个程序中同时有多个运行的线程。每个线程都有一个优先级(priority),优先级高的线程运行时要优先于优先级低的线程,每个线程要么是守护线程,要么不是。当一个线程在运行时创建另一个线程是,新线程最初的优先级和创建它的原创 2016-03-26 01:40:44 · 235 阅读 · 0 评论 -
只读共享
前面讲了保证线程安全的两种思路:安全的共享(保证同步)和线程封闭(不共享也就不存在线程安全的问题)。还有一种思路是共享只读的数据(不可更改当然没有一致性的问题)。并发编程书中强调了不可变对象一定是线程安全的。原创 2016-04-03 12:34:26 · 424 阅读 · 0 评论 -
java ThreadLocal及线程封闭
当访问共享的可变数据时,需要使用同步机制。那么换一个思路,不共享对象就可以避免使用同步机制。1.栈封闭java中基本类型的局部变量及对象引用是保存在java栈中并且是线程隔离的,因此,在方法中全部使用基本类型的局部变量并且保证对象的引用不会逸出,那么就可以确保其他线程不能访问到,因此就不需要同步机制。2.ThreadLocal使用ThreadLocal共享数据其实并不是共享同一个数据,而是为每一个线原创 2016-04-01 21:37:13 · 339 阅读 · 0 评论 -
java volatile变量
valatile用来修饰共享变量,是一种弱的同步机制,用来确保将变量的更新操作通知到其他线程。volatile实现原理首先看一段代码:public class SynchronizedExample { //一个控制变量,作为print方法的结束控制 private boolean asleep = false; public void print() { w原创 2016-04-01 18:27:54 · 313 阅读 · 0 评论 -
java Executor框架
1.为什么要使用线程池单线程执行任务必须串行的执行,那么如果某个任务需要很长的计算时间或者发生IO等阻塞,那么后面的任务必须长时间的等待。并且在多处理器环境中,单线程只占用一个处理器,其他处理器得不到利用。假设为每一个任务创建一个线程(即无限制的创建线程),任务执行完之后销毁线程。那么频繁的创建和销毁线程需要很大的开销;并且当线程的数量远大于处理器的数量时,大量的线程需要在内存中等待并占用内存;原创 2016-04-17 12:51:52 · 425 阅读 · 0 评论