Java并发编程笔记之基础总结(一)】的更多相关文章

一.线程中断 Java 中线程中断是一种线程间协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是需要被中断的线程根据中断状态自行处理. 1.void interrupt() 方法:中断线程,例如当线程 A 运行时,线程 B 可以调用线程 A 的 interrupt() 方法来设置线程 A 的中断标志为 true 并立即返回.设置标志仅仅是设置标志,线程 A 并没有实际被中断,会继续往下执行的.如果线程 A 因为调用了 wait 系列函数或者 join 方法或者 sleep 函数而被…
一.线程概念 说到线程就必须要提一下进程,因为线程是进程中的一个实体,线程本身是不会独立存在的.进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程至少有一个线程,进程中的多个线程是共享进程的资源的.操作系统在分配资源时候是把资源分配给进程的,但是 CPU 资源就比较特殊,它是分派到线程的,因为真正要占用 CPU 运行的是线程,所以也说线程是 CPU 分配的基本单位. Java 中当我们启动 main 函数时候其实就启动了一个 JVM 的…
什么是线程安全 当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 竞态条件 当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件.换句话说就是正确的结果取决于运气. 数据竞争 数据竞争是指,如果在访问非final类型的域时没有采用同步来进行协同,那么就会出现竞争. 重入 由于内置锁是可以重入的,因此如果某个线程试图获得一个已由它自己持有的锁,那么这个…
java并发编程笔记(十一)--高并发处理思路和手段 扩容 垂直扩容(纵向扩展):提高系统部件能力 水平扩容(横向扩容):增加更多系统成员来实现 缓存 缓存特征 命中率:命中数/(命中数+没有命中数) 一.影响因素 业务场景和业务需求 缓存的设计(粒度和策略) 缓存的容量和基础设施 二.缓存分类和应用场景 本地缓存:编程实现(成员变量,局部变量,静态变量).Guava Cache 分布式缓存:Memcache.Redis 三.常用组件 Guava Cache public class Guava…
java并发编程笔记(六)--AQS 使用了Node实现FIFO(first in first out)队列,可以用于构建锁或者其他同步装置的基础框架 利用了一个int类型表示状态 使用方法是继承 子类通过继承并通过实现它的方法管理其状态(acquire和release)的方法操纵状态 可以同时实现排它锁和共享锁模式(独占.共享) AQS同步组件 CountDownLatch Semaphore CyclicBarrier ReentrantLock Condition FutureTask C…
java并发编程笔记(十)--HashMap与ConcurrentHashMap HashMap参数 有两个参数影响他的性能 初始容量(默认为16) 加载因子(默认是0.75) HashMap寻址方式 对一个我们需要插入的数据或者我们要读取的数据,首先hashMap会将它的key按照一定的计算规则计算出的hash值并对我们的数组长度进行取模,结果作为插入数组织位置的index. 在计算中,取模的代价远远高于位移的代价,因此hashMap要求数组的长度一定是2的n次方:此时它将key的hash值对…
java并发编程笔记(九)--多线程并发最佳实践 使用本地变量 使用不可变类 最小化锁的作用域范围 使用线程池Executor,而不是直接new Thread执行 宁可使用同步也不要使用线程的wait和notify 使用BlockingQueue实现生产-消费模式 使用并发集合而不是加了锁的同步集合(比如Collections.synchronized这些集合尽量避免使用,应该用J.U.C中提供的专门的同步集合) 使用Semaphore创建有界的访问 宁可使用同步代码块,也不要使用同步的方法 避…
java并发编程笔记(八)--死锁 死锁发生的必要条件 互斥条件 进程对分配到的资源进行排他性的使用,即在一段时间内只能由一个进程使用,如果有其他进程在请求,只能等待. 请求和保持条件 进程已经保持了至少一个资源,但是又提出了新的资源请求,而该资源又被其他进程占有,造成请求阻塞,但是又对自己已经占有的资源不放 不剥夺条件 是指进程在对已经占有的资源未使用完的情况下,不能被剥夺,只能在使用完时自己释放 环路等待条件 public class DeadLock implements Runnable…
java并发编程笔记(七)--线程池 new Thread弊端 每次new Thread新建对象,性能差 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM 缺少更多功能,如更多执行.定期执行.线程中断 线程池的好处 重用存在的线程,减少对象创建.消亡的开销,性能佳 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞 提供定时执行.定期执行.单线程.并发数控制等功能 ThreadPoolExecutor 重要核心参数 core…
java并发编程笔记(五)--线程安全策略 不可变得对象 不可变对象需要满足的条件 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出) final关键字:类.方法.变量 修饰类:不能被继承 修饰方法:1.锁定方法不被继承类修改:2.效率,目前近期版本已经将私有方法默认设置为final,final能够使方法转为内嵌调用. 修饰变量:基本数据类型变量.引用类型变量 定义不可变对象的其他方法: Collections.unmodifi…