
多线程
itzilong
这个作者很懒,什么都没留下…
展开
-
java.util.concurrent包学习(一)锁的基本原理
与synchronized不同,Lock完全用Java写成,在java这个层面是无关JVM实现的。 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueuedSync转载 2017-08-16 10:45:41 · 431 阅读 · 0 评论 -
java多线程学习总结
以、多线程首先遇到的第一个问题是并发问题:在多线程访问共有内存数据(即类与对象所持有字段与方法,不包括非静态方法内的对象)会出现的问题。即下图红色部分。而面对并发问题。我们通常只能使用synchronize或者Lock锁,这样我们才能保证在同一个时刻同一块内存只有一个线程去操作,这样保证了数据的正确性。但是这也带来了效率低下的问题。同一时刻同一个内存区域只能由一个线程去操作。但是当对一原创 2017-08-10 16:21:24 · 304 阅读 · 0 评论 -
Java线程池深入分析
由于最近在开发一个嵌入式设备时,用户会进行频繁的取消功能、手机频繁的按返回键等,而且客户的手机配置又低,导致程序在极端测试时出现了屏幕卡顿或应用崩溃的问题。而且我本身的应用框架线程间的通讯主要用的还是AsynchTask与Handler。但是由于android本身提供的这些框架不能让子线程实现立刻停止运行,没法让应用达到最后的体验。所以我决定深研线程,首先从java本身提供的多线程框架与andro原创 2017-08-16 14:26:55 · 527 阅读 · 0 评论 -
CAS操作
一、简述CAS(Compare and Swap),比较并交换,通过利用底层硬件平台的特性,实现原子性操作。CAS 操作涉及到3个操作数,内存值 V,旧的期望值 A,需要修改的新值 B。当且仅当旧的期望值 A 和 内存值 V 相同时,才将内存值 V 修改为 B,否则什么都不做。CAS 操作类似于执行了下面流程if(oldValue == memory[valueAddress]){原创 2017-09-06 14:33:42 · 692 阅读 · 0 评论 -
同步队列
AQS 依赖内部的同步队列(一个 FIFO的双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把队列中第一个等待节点线程唤醒(下图中的 Node1),使其再次尝试获取同步状态。同步队列的结构如下所示:Head 节点本身不保存等待线程的信息,它通过 next原创 2017-09-06 17:35:21 · 1314 阅读 · 0 评论 -
AbstractQueuedSynchronizer详解
一、简介AbstractQueuedSynchronizer队列同步器,简称AQS。是用来构建锁或者其他同步组中的基础框架。它使用了一个int成员变量status来表示同步状况。通过CAS对status进行操作来确保状态的改变是安全的。对于CAS不了解的可以看这个文章点击打开链接。通过内置FIFO(First In First out)队列来完成资源获取线程的排队工作。可以说这个框架在锁与并发原创 2017-08-22 13:49:39 · 762 阅读 · 0 评论 -
RxJava 详解
public void onNext(User user) { userView.setUser(user); } @Override public void onCompleted() { } @Override public void onError(Throwable转载 2017-07-21 10:13:30 · 266 阅读 · 0 评论 -
AsyncTask
首先从Android3.0开始,系统要求网络访问必须在子线程中进行,否则网络访问将会失败并抛出NetworkOnMainThreadException这个异常,这样做是为了避免主线程由于耗时操作所阻塞从而出现ANR现象。AsyncTask封装了线程池和Handler。AsyncTask有两个线程池:SerialExecutor和THREAD_POOL_EXECUTOR。前者是用于任务的排队,默认是原创 2017-07-20 17:47:17 · 352 阅读 · 0 评论 -
Handler、Looper、Message、MessageQueue基础流程分析
##Looper(先分析这个是因为能够引出四者的关系) 在Looper中,维持一个Thread对象以及MessageQueue,通过Looper的构造函数我们可以知道: private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed);//传入的参数代表这个Queue是否能够被退出转载 2017-07-21 10:07:16 · 307 阅读 · 0 评论 -
android-Message解析
一、首先解析一下该类中的重点方法与字段1、private static final Object sPoolSync = new Object();//创建线程锁2、private static Message sPool;//Message实例对象,用于Message的重复利用率3、private static int sPoolSize = 0;//Message pool的数量4原创 2017-07-28 14:09:24 · 357 阅读 · 0 评论 -
Android的线程间通信Hanlder、Looper、Message、MessageQueue
一、先来一个总结性的语言,然后再细分析。(1)、当我们调用handler.sendMessage(msg)方法发送一个Message时,实际上这个Message是发送到与当前线程绑定的一个MessageQueue中,然后与当前线程绑定的Looper将会不断的从MessageQueue中取出新的Message,调用msg.target.dispathMessage(msg)方法将消息分发到与Me原创 2017-07-31 18:10:53 · 366 阅读 · 0 评论 -
深入分析java线程池的实现原理
前言线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控,有以下好处:1、降低资源消耗;2、提高响应速度;3、提高线程的可管理性。Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行、被哪个线程执行,以及什么时候执行。dem转载 2017-08-03 18:16:53 · 271 阅读 · 0 评论 -
java中volatile关键字
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和原创 2017-08-09 13:59:21 · 284 阅读 · 0 评论 -
Java中Unsafe类详解
java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存;类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。2、可以定位对象某字段的内存位置,也可转载 2017-08-10 15:33:16 · 615 阅读 · 0 评论 -
Java并发之AQS详解
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是转载 2017-08-16 10:45:32 · 362 阅读 · 1 评论 -
Future和Callable、FutureTask实现,带有返回值的线程请求
通过ExecutorService.submit()方法提交的任务,可以获取任务执行完的返回值。在实际业务场景中,Future和Callable基本是成对出现的,Callable负责产生结果,Future负责获取结果。1、Callable接口类似于Runnable,只是Runnable没有返回值。2、Callable任务除了返回正常结果之外,如果发生异常,该异常也会被返原创 2017-09-08 18:37:49 · 2043 阅读 · 0 评论