java多线程
文章平均质量分 92
huanshirenjian
这个作者很懒,什么都没留下…
展开
-
数据存储的5个地方
1.寄存器寄存器是最快的存储区,它位于处理器内部。但是寄存器的数量及其有限,所以寄存器根据需求进行分配,不可直接控制。2.堆栈位于通用RAM(随机访问存储器)中,通过堆栈指针可以从处理器获得直接支持。堆栈指针若向下移动,则分配新的内存,若向上移动,则释放内存。3.堆一种通用的内存池(也位于RAM区),用于存放所有的java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活的时间。4.常转载 2016-11-18 10:09:35 · 1021 阅读 · 0 评论 -
java多线程系列14-ConcurrentLinkedQueue、写时复制容器分析
1.ConcurrentLinkedQueue无界非阻塞队列,底层是个链表,遵循先进先出原则。add,offer将元素插入到尾部,peek(拿头部的数据,但是不移除)和poll(拿头部的数据,但是移除)。并发用的cas控制。源码不再详细分析,有前面13章分析继续,源码理解不难2.写时复制容器(1)CopyOnWriteArrayList写时复制的容器。通俗的理解是当我们往一个容器添加元素...原创 2019-04-18 11:53:46 · 233 阅读 · 0 评论 -
java多线程系列15-阻塞队列
1.阻塞队列使用场景阻塞队列最常使用的场景是生产者和消费者模式。生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,便有了生产者和消费者模式。生产者和消费者模式是通过一个容...原创 2019-04-19 14:56:56 · 185 阅读 · 0 评论 -
java多线程系列19-java的内存模型
并发编程中,有两个关键问题:线程之间如何通信和同步。1.线程之间的通信通信指线程之间如何交换信息。线程之间有两种通信机制:共享内存和消息传递。(1)共享内存线程之间共享程序的公共状态,通过读写内存中的公共状态进行隐式通信。(2)消息传递通过发送消息进行显示通信2.线程之间的同步共享内存模型中,同步是显示的。而消息传递中同步是隐式的,因为发送消息肯定在接收之前。java中采用的是共...原创 2019-04-20 18:56:16 · 84 阅读 · 0 评论 -
java多线程系列20-单例模式
单例模式有两种立即加载和延迟加载。立即加载这种不多说,主要说说延迟加载。平时在很多地方的延迟加载都用了双重检查:这种实际在所线程下并不是线程安全的,主要问题在于创建一个对象实际上大致可以分为三步:1.分配对象内存空间2.初始化对象3.将对象引用指向刚分配的内存地址这里编译器可能对步骤2和和步骤3对象重排序,导致其他线程看到未初始化的字段属性。这里有两种结局方案:(1)将变量设为vo...原创 2019-04-20 18:56:12 · 130 阅读 · 0 评论 -
java多线程系列18-多线程性能
1.影响性能的因素(1)上下文切换是指CPU 从一个进程或线程切换到另一个进程或线程。一次上下文切换花费5000~10000个时钟周期,几微秒。在上下文切换过程中,CPU会停止处理当前运行的程序,并保存当前程序运行的具体位置以便之后继续运行。从这个角度来看,上下文切换有点像我们同时阅读几本书,在来回切换书本的同时我们需要记住每本书当前读到的页码。上下文切换通常是计算密集型的。也就是说,它需要...转载 2019-04-20 16:43:21 · 321 阅读 · 0 评论 -
java多线程系列17-多线程安全
1.类的线程安全如果多线程下使用这个类,不论多线程如何使用和调度这个类,这个类总是表示出正确的行为,这个类就是线程安全的。什么是正确的行为?操作的原子性和内存的可见性如何保证类的线程安全:所有的变量都是在方法内部声明的,这些变量都处于栈封闭状态。没有任何成员变量的类,就叫无状态的类让状态不可变,两种方式:1,加final关键字,对于一个类,所有的成员变量应该是私有的,同样的只要有可...原创 2019-04-20 16:37:08 · 117 阅读 · 0 评论 -
java多线程系列16-线程池
1.线程池线程池大家平时都经常使用,使用线程池有什么好处:降低资源的消耗。降低线程创建和销毁的资源消耗提高响应速度:线程的创建时间为T1,执行时间T2,销毁时间T3,免去T1和T3的时间提高线程的可管理性2.ThreadPoolExecutorThreadPoolExecutor,jdk所有线程池实现的基础。2.1重要参数含义int corePoolSize:线程池中核心线程数...原创 2019-04-20 16:16:16 · 205 阅读 · 0 评论 -
java多线程系列13-ConcurrentSkipListMap、ConcurrentSkipListSet源码分析
1.介绍ConcurrentSkipListMap是TreeMap的并发版本,、ConcurrentSkipListSet是treeSet的并发版本。两者都利用了跳表的原理。2.跳表SkipList,以空间换时间,在原链表的基础上形成多层索引,但是某个节点在插入时,是否成为索引,随机决定,所以跳表又称为概率数据结构。3.ConcurrentSkipListMap源码分析(1)put方法...原创 2019-04-18 11:31:14 · 143 阅读 · 0 评论 -
java多线程系列11-多线程下HashMap源码分析
1.Hashmaphashmap低层数据结构用的是数组加链表。这时候就会涉及到几个问题,如何定位数据在hashmap中的位置?如何减少hash冲突?如何保证hash值不超过数组的长度。1.1 hash哈希:把任意长度的输入通过一种算法(散列),变换成为固定长度的输出,这个输出值就是散列值。属于压缩映射,容易产生哈希冲突。产生哈希冲突时解决办法:1.开放寻址;2、再散列;3、链地址法(相同h...原创 2019-04-17 18:53:30 · 126 阅读 · 0 评论 -
java多线程系列10-读写锁ReentrantReadWriteLock源码分析
1.ReentrantReadWriteLock介绍ReentrantReadWriteLock是基于AQS实现的另外一个比较常见的读写锁,适用多读少写的场景。也分为公平锁和非公平锁。和之前分析的锁不同的是,它两把锁,一把读锁,一把写锁。2.读锁(1)lock方法 public void lock() { this.sync.acquireShared(1); }(2)ac...原创 2019-04-16 21:24:03 · 291 阅读 · 0 评论 -
java多线程系列6-锁
1. 乐观锁和悲观锁 锁可以分为两类:乐观锁和悲观锁。 悲观锁:在操作数据前,总认为其他线程会修改,所以会加锁,直到处理完后释放锁。比如:synchronized关键字 乐观锁:在操作数据前,总认为其他线程不会会修改,只有在更新时候才会判断数据是否有变化。比如cas。2.volatile (1)提到锁的时候不得不说volatile关键字。这个是用来保证可见性,但不能保证原子性。 (2...原创 2019-04-15 10:12:31 · 167 阅读 · 0 评论 -
java多线程系列1-线程基础概念
#线程基础概念原创 2019-04-02 18:43:38 · 127 阅读 · 0 评论 -
java多线程系列2-java线程基础
1.线程创建的方式继承Thread类实现Runnable实现Callable2.线程常用方法isAlive():判断是否处于活动状态,线程已经启动(不论线程正在运行还是准备运行),并且尚未终止sleep():让当前(正在执行的线程)休眠指定时间。Thread类静态方法。stop():不建议使用,暴力停止线程,导致不正确释放资源,对象可能处于不连贯状态。...原创 2019-04-03 18:51:33 · 86 阅读 · 0 评论 -
java多线程系列3-对象锁、类锁、等待通知模式
1. 对象锁和类锁 对象锁:锁的是类的对象 类锁:锁的是类对应的class对象,该class对象在jvm中只有一个,所以类锁只有一个2. 等待通知模式 等待方: - 获得对象锁 - 循环判断条件是否满足,不满足调用wait()方法 - 执行业务逻辑 通知方: - 获得对象锁 - 改变条件 - 通知等待线程 对于等待超时模式: 在判断条件时候需要...原创 2019-04-08 18:54:48 · 111 阅读 · 0 评论 -
java多线程系列7-AbstractQueuedSynchronizer源码分析
1. AbstractQueuedSynchronizer介绍 AbstractQueuedSynchronizer简称AQS,是java中锁或者同步器的核心类,可以毫不夸张的说这个类是了解并发框架中锁的基础。2. AQS数据结构 AQS低层用的数据结构是一个双向链表,是队列的一种实现,也可看成是队列并且是FIFO。如下图所示,其中Sync queue,即同步队列,是双向链表,包括head...原创 2019-04-16 12:35:45 · 214 阅读 · 0 评论 -
java多线程系列4-ForkJoin框架
1.分而治之 分而治之简单来说就是将大任务拆分为多个小任务分别执行。假如规模为M的问题,如果规模小于条件阈值N,则直接计算。否则将任务拆分为两个小任务,再进行判断,直到任务不可再分。最后将任务的结果合并。2.工作密取 工作密取简单来说就是帮别人干活。假如线程A中有自己工作队列,线程B也有自己工作队列。线程A完成自己所有任务,而发现线程B还没有时候,可以从线程B的工作队列中获取任务执行。...原创 2019-04-09 18:12:40 · 137 阅读 · 0 评论 -
java多线程系列5-并发工具类
1.CountDownLatch 作用:一组线程等待其他线程执行完成后,再执行任务。类型join方法 调用await方法等待,countdown方法让数量减一2.CyclicBarrier 作用:一组线程到达某个状态后等待,知道线程组内最后一个线程到达后,再继续执行。 这里有个方法额外说明下:public CyclicBarrier(int parties, Runnable barr...原创 2019-04-09 19:14:02 · 323 阅读 · 0 评论 -
java多线程系列8-ReentrantLock源码分析
1.ReentrantLock介绍ReentrantLock是基于AQS实现的典型重入锁,在平时开发中或者其他源码类中出现频率也很高。在前一篇AQS源码分析基础上,分析下ReentrantLock的源码。ReentrantLock分为公平锁和非公平锁。2.非公平锁ReentrantLock默认是非公平锁,也可指定创建公平锁。(1)默认非公平锁,也可构造公平锁 public Ree...原创 2019-04-16 19:27:16 · 477 阅读 · 0 评论 -
java多线程系列9-共享锁Semaphore源码解析
1.Semaphore介绍Semaphore其实在前面并发工具类中介绍过。Semaphore初始化时会设值许可证的数量,即state的值。当有个线程尝试获取锁时,会尝试更新state的值,一般是将state的值减一。如果成功,则获得锁成功。如果state的值减到0时,后续线程获得锁将会加入队列等待。Semaphore也会分为公平锁和非公平锁。先看下构造方法: public Semapho...原创 2019-04-16 19:53:37 · 172 阅读 · 0 评论 -
java多线程系列12-ConcurrentHashMap源码分析
1.HashTable分析ConcurrentHashMap前,先简单分析下HashTable。HashTable使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮询状态。如线程1使用put进行元素添加,线程2不但不能使用put方法添加元...原创 2019-04-17 20:59:50 · 140 阅读 · 0 评论