多线程
天总会亮
这个作者很懒,什么都没留下…
展开
-
1.线程安全
线程安全概念: 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。 synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为"互斥区"或"临界区" " public class MyThread extends Thread{ private int count = 5 ;...原创 2018-09-12 10:28:58 · 83 阅读 · 0 评论 -
14.DelayQueue
带有延迟时间的queue,其中的元素只有当它指定的延迟时间到了,才能从队列中获取该指定的元素,DelayQueue中的元素必须实现Delayed接口,它是一个没有大小限制的队列,应用场景比较多,比如缓存超时的数据移除,任务超时处理,空闲连接关闭等。 public class Wangmin implements Delayed { private String na...原创 2018-09-26 16:42:14 · 153 阅读 · 0 评论 -
13.ProprityBlockingQueue
它是基于优先级阻塞队列(优先级的判断通过构造函数传入的Compato对象来决定,也就是传入的队列对象必须实现comparable接口),在实现ProprityBlockingQueue时,内部控制线程的锁采用的是公平锁,它也是一个无界队列。 public class Task implements Comparable<Task>{ private int id ;...原创 2018-09-26 16:40:58 · 306 阅读 · 0 评论 -
12.LinkedBlockingQueue
它是基于链表的阻塞队列,其内部也维护这一个数据缓冲队列(该队列由链表组成),LinkedBlockingQueue能够高效的处理并发数据,是因为其内部实现了分离锁,从而实现消费者和生产者完全并行,是一个无界队列。 public class UseQueue { public static void main(String[] args) throws Exception { ...原创 2018-09-26 15:58:49 · 95 阅读 · 0 评论 -
11.ArrayBlockingQueue
它是基于数组阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,其内部没有实现读写分离,也就意味着生产和消费不能完全并行,长度也是需要定义的,可以指定先进先出或者先进后出,也叫有界队列。 public class UseQueue { public static void main(String[] args) throws Ex...原创 2018-09-26 15:40:58 · 122 阅读 · 0 评论 -
9.ConcurrentLinkedQueue
它是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue,它是一个基于连接节点的无界线程安全队列,该队列元素遵循先进先出的原则,头最先加入,尾最近加入,不允许有空元素。 ConcurrentLinkedQueue重要方法 Add()和offer()都是添加的方法。 Poll()和peek()都是...原创 2018-09-26 15:16:37 · 103 阅读 · 0 评论 -
10.BockingQueue
它是一个队列,支持阻塞机制,阻塞的放入和得到数据。常用方法:Offer(anObject):表示如果有可能,将anObject加到队列中,如果可以容纳,则返回true,否则返回false,(本方法不阻塞当前执行线程的方法)。Put(anObject):把anObject添加到队列中,如果队列没有空间,调用方法的线程被阻塞,直到队列有空间再加入。Poll(time):取走队列中排在首...原创 2018-09-26 14:36:38 · 223 阅读 · 0 评论 -
8.CountDownLatch
CountDownLatch是一种同步手段,允许一个或者更多的线程等待,直到在其他线程正在执行的一组操作完成。给定count数目后CountDownLatch被初始化。await()方法阻塞,直到由于调用countDown()方法,当前count值达到0,之后所有等待线程被释放,而任何后续await()方法的调用会立即返回. public class ListAdd2 { private...原创 2018-09-26 14:34:24 · 59 阅读 · 0 评论 -
7.wait/notify方法。
Wait和notify方法必须配合synchronized关键字使用。 Wait方法释放锁,notify方法不释放锁。 public class ListAdd1 { private volatile static List list = new ArrayList(); public void add(){ list....原创 2018-09-26 14:33:03 · 69 阅读 · 0 评论 -
6.volatile关键字。
Volatile关键字的主要作用是使变量在多个线程间可见。 在java中,每一个线程都会有一块内存区,其中存放着所有线程共享的主内存中变量值的拷贝,当线程执行时,他在自己的工作内存中操作这些变量,为了存取一个共享变量,一个线程通常先获取锁定并清除他的内存工作区,把这些变量从所有的共享内存区中装入到他自己所在的工作内存区中,当线程结束时保证该工作内存区中变量的值回到共享内存中。 V...原创 2018-09-12 17:22:56 · 94 阅读 · 0 评论 -
5.synchronized代码块。
使用synchronized声明的方法在某些情况下是有弊端的,比如:当A线程调用同步的方法执行一个长时间的任务,那么B线程就需要等待较长的时间才能执行,这样情况下可以使用synchronized代码块去优化代码的执行时间,减小锁的粒度。 public class Optimize { public void doLongTimeTask(){ try { ...原创 2018-09-12 17:21:46 · 158 阅读 · 0 评论 -
4.脏读。
对于对象的同步和异步的方法,在设计程序的时候一定要考虑问题的整体性,不然会出现数据不一致的错误,经典的就是脏读。 在对对象加锁的时候,要考虑业务的整体性,及为setValue/getVaule方法同时加锁synchronized关键字,保证业务的原子性,不然会出现错误。 public class DirtyRead { private String username = "f...原创 2018-09-12 17:18:14 · 747 阅读 · 0 评论 -
3.对象锁的同步和异步问题
同步:synchronized 同步的概念就是共享,如果不是共享资源就没必要进行同步。同步的目的是为了线程安全,需要满足两个特性,原子性,可见性 异步:asynchronized 异步的概念就是独立,互相之间不受影响。 t1线程先持有object对象的Lock锁,t2线程可以以异步的方式调用对象中的非synchronized修饰的方法。 public class MyO...原创 2018-09-12 17:17:03 · 121 阅读 · 0 评论 -
2.synchronized
synchronized:关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock) public class MultiThread { private int num = 0; /** static */ public s...原创 2018-09-12 10:52:28 · 134 阅读 · 0 评论 -
15.SynchronousQueue
SynchronousQueue是这样一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。一种没有缓冲的队列,生产者生产数据直接或被消费者获取并消费。 public class UseQueue { public static void main(String[] args) throws Exception {...原创 2018-09-26 16:42:58 · 161 阅读 · 0 评论