Java:并发笔记-09】的更多相关文章

Java:并发笔记-09 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 7. 共享模型之工具-2 原理:AQS 原理 对于 AQS 的原理这部分内容,没很好的理解,等功力深厚了再回来好好理解一下,笔记也就不贴出来了 原理:ReentrantLock 原理 同样对于 ReentrantLock 的原理这部分内容,没很好的理解,等功力深厚了再回来好好理解一下 7.2 J.U.C 3. 读写锁 3.1 ReentrantReadWriteLock 当读操作远远…
警告⚠️:本文耗时很长,先做好心理准备,建议PC端浏览器浏览效果更佳. 本篇我们讲通过大量实例代码及hotspot源码分析偏向锁(批量重偏向.批量撤销).轻量级锁.重量级锁及锁的膨胀过程(也就是锁的升级过程)   我们先来说一下我们为什么需要锁? 因为在并发情况为了保证线程的安全性,是在一个多线程环境下正确性的概念,也就是保证多线程环境下共享的.可修改的状态的正确性(这里的状态指的是程序里的数据),在java程序中我们可以使用synchronized关键字来对程序进行加锁. 当声明synchro…
JAVA自学笔记09 1.子类的方法会把父类的同名方法覆盖(重写) 2.final: 1)可修饰类.方法.变量 2)修饰类时:此时该类变为最终类,它将无法成为父类而被继承 3)修饰方法时:该方法将无法被重写 4)变量为常量,其值不可被改变 修饰引用类型时:引用类型的地址值不能变但其成员变量(堆内存的值)等是可以变的 5)初始化时机: 被final修饰的变量只能赋值一次 在构造方法完毕前修饰变量,避免其被构造方法改变(非静态的常量) 3.多态 1)某一个事物,在不同时刻表现出不同的状态 2)前提与…
警告⚠️:本文耗时很长,先做好心理准备 证明:偏向锁.轻量级锁.重量级锁真实存在 由[java并发笔记之java线程模型]链接: https://www.cnblogs.com/yuhangwang/p/11256476.html这篇文章可知:每当java线程创建的时候相对应的os pthread_create()也会创建一个线程,使用synchronized()就必然调用os pthread_mutex_lock() 函数 synchronized关键字锁的状态:无锁.偏向锁.轻量级锁.重量级…
单例模式可以使得一个类只有一个对象实例,能够减少频繁创建对象的时间和空间开销.单线程模式下一个典型的单例模式代码如下: ① class Singleton{ private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton == null){ singleton = new Singleton(); //1 } return singleton…
警告⚠️:本文耗时很长,先做好心理准备 本篇将从hotspot源码(64 bits)入手,通过分析java对象头引申出锁的状态:本文采用大量实例及分析,请耐心看完,谢谢   先来看一下hotspot的源码当中的对象头的注释(32bits 可以忽略了,现在基本没有32位操作系统): *  Bit-format of an object header (most significant first, big endian layout below): *  32 bits: *  --------…
为什么需要并行? – 业务要求 – 性能 并行计算还出于业务模型的需要 – 并不是为了提高系统性能,而是确实在业务上需要多个执行单元. – 比如HTTP服务器,为每一个Socket连接新建一个处理线程 – 让不同线程承担不同的业务工作 – 简化任务调度 Linus Torvalds :并行计算只有在 *图像处理* 和 *服务端编程* 2个领域可以使用,并且它在这2个领域确实有着大量广泛的使用.但是在其它任何地方,并行计算毫无建树! 计算密集型 在多核时代,一般没有必要特别区分并发和并行 同步(s…
1. 活跃性危险 死锁(最常见) 饥饿 当线程由于无法访问它所需的资源而不能继续执行时,就发生了饥饿.引发饥饿最常见资源就是CPU时钟周期. 活锁 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败. 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待:活锁有可能自行解开,死锁则不能. 活锁可以认为是一种特殊的饥饿. 下面这个例子在有的文章里面认为是活锁.实际上这只是一种饥饿.因为没有体现出“活”的特点:…
1. lock (todo) 2. 写时复制容器 CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器.CopyOnWrite并发容器用于读多写少的并发场景.Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器, 它们是CopyOnWriteArrayList和CopyOnWriteArraySet (没…
警告⚠️:本文耗时很长,先做好心理准备 java当中的线程和操作系统的线程是什么关系? 猜想: java thread —-对应-—> OS thread Linux关于操作系统的线程控制源码:pthread_create()Linux命令:man pthread_create int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);…
先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显涉及到了线程间通数据的共享,四个线程共享一个 data,共同操作一个 data.我们先把上面这个问题放在一边,慢慢分析多个线程之间共享数据的一些情况,从最简单开始,分类分析完了后,到时候也好解决上面这个问题了. 1. 每个线程执行的任务相同 这是最简单的一种情况,比如卖票,几个线程共同操作记录票数的那个变量,任务都是使它减一.针对这种情况,我们只需要写一个类实现…
重入锁的特性, 避免死锁, 如果有锁的话, 不用重新加锁, 直接增加锁的次数.. Synchronize, ReentrantLock都是重入锁. 读写锁, ReentrantReadWriteLock里面有两把锁, 读锁和写锁,适用于读多写少的情景. 读->读会共享 读->写 互斥 写->写 互斥. AQS: 全称 AbstractQueuedSynchronizer,它 是一个同步工具也是 Lock 用来实现线程同步的核心组件. AQS 的功能分为两种:独占和共享 I.AQS的sta…
Java并发性和多线程介绍   java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题,多开线程就好: 快速响应,异步式设计: 多线程代价: 实现负载,虽然开线程没什么难度,但是修改共享模块的时候,会有争用的可能性: 上下文切换所带来的开销.CPU进行上下文切换代价蛮大,运行线程更换需要上下文切换,为了效率,尽量避免: 资源消耗,虽然线程不占用资源,但是管理需要资源,自身实例化也需要相应的堆栈内…
Java:并发笔记-08 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 7. 共享模型之工具-1 7.1 线程池 1. 自定义线程池 步骤1:自定义拒绝策略接口 // 拒绝策略 @FunctionalInterface interface RejectPolicy<T>{ void reject(BlockingQueue<T> queue, T task); } 步骤2:自定义任务队列 // 自定义任务队列 class BlockingQ…
Java:并发笔记-04 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 本章内容-3 线程状态转换 活跃性 Lock 3.10 重新理解线程状态转换 假设有线程 Thread t 情况 1 NEW --> RUNNABLE 当调用 t.start() 方法时,由 NEW --> RUNNABLE 情况 2 RUNNABLE <--> WAITING t 线程用 synchronized(obj) 获取了对象锁后 调用 obj.wait()…
Java:并发笔记-03 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 3. 共享模型之管程-2 本章内容-2 Monitor wait/notify 3.6 Monitor 概念 Java 对象头 以 32 位虚拟机为例 普通对象 数组对象 其中 Mark Word 结构为 64 位虚拟机 Mark Word 参考资料 https://stackoverflow.com/questions/26357186/what-is-in-java-object…
Java:并发笔记-01 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 1. 进程与线程 本章内容 进程和线程的概念 并行和并发的概念 线程基本应用 1.1 进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存.在指令运行过程中还需要用到磁盘.网络等设备.进程就是用来加载指令.管理内存.管理 IO 的: 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程: 进程就可以视为程序…
目录 1,基本概念 2,volatile 3,atom 4,ThreadLocal 5,CountDownLatch和CyclicBarrier 6,信号量 7,Condition 8,Exchanger 在Java中,JVM.并发.容器.IO/NIO是我认为最重要的知识点,本章将介绍其中的并发,这也是从“会Java”到精通Java所必须经历的一步.本章承接上一张<Java系列笔记(5) - 线程>,其中介绍了Java线程的相关知识,是本章介绍内容的基础,如果对于线程不熟悉的,可以先阅读以下这…
title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1.并发编程模型的两个关键问题 1.1线程之间如何通信. 通信是指线程之间以何种机制来交换信息.有两种:共享内存和消息传递.在共享内存的并发模型里,线程之间共享程序的公共状态,通过读写内存中的公共状态进行隐式通信.在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显示进行通信.j…
title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- 1.多线程不一定就比单线程快,因为线程有创建和上下文切换的开销. 1.1vmstat测试上下文切换次数,Lmbench3测时长 1.2如何减少上下文切换 1.2.1无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID取模分段,不同的线程处理…
----------------------------------------------<Java并发编程实战>读书笔记------------------------------------------------------------------------------ 第二章 线程安全性 java同步 1.sychronized  2.volatile类型  3.显示锁  4.原子变量性能优化之原则:首先保证代码能正确运行,然后再提高代码速度.并且,只是当性能测试结果和应用需求需要…
上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Hashtable,此外还包括在JDK1.2中添加的一些功能相似的类,这些同步的封装器类由Collections.synchronizedXxx等工厂方法创建的.这些类实现线程安全的方式是:将他们的状态封装起来,并对每个共有方法都进行同步,使得每次只能有一个线程能访问容器的状态. 关于java中的Vect…
<Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. 在Java中,所有实例域.静态域和数组元素都存储在堆内存中,堆内存在线程之间共享.局部变量(Local Variables),方法定义参数(Java语言规范称之为Formal Method Parameters)和异常处理器参数(ExceptionHandler Parameters)不会在线程之间共享,它…
<Java并发编程实战>读书笔记一 -- 简介 并发的历史 并发的历史,也是人类利用有限的资源去提高生产效率的一个的例子. 设想现在有台计算机,这台计算机具有以下的资源: 单核CPU一个 内存 磁盘 打印机 就跟下图所示: 一台简要的计算机 很久以前(也没多久,几十年前),计算机只能跑一个程序(可以回想下初学51时候的点灯程序).这个时候程序是非常的自由的,因为他可以占用整个计算机的所有的资源.如下所示: 点灯程序占用了所有的资源 往往有些程序很贱,明明占用着很多的资源,但是却不好好利用,上图…
关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不会执行任何操作.无论位置V的值是否等于A,都将返回V原有的值.然后线程可以基于新返回的V值来做对应的操作,可以反复尝试.通常,反复重试是一种合理的策略,但在一些竞争很激烈的情况下,更好的方式是在重试之前首先等待一段时间或者回退,从而避免造成活锁问题.CAS的主要缺点就是,它将使调用者处理竞争问题,而…
java并发编程笔记(十一)--高并发处理思路和手段 扩容 垂直扩容(纵向扩展):提高系统部件能力 水平扩容(横向扩容):增加更多系统成员来实现 缓存 缓存特征 命中率:命中数/(命中数+没有命中数) 一.影响因素 业务场景和业务需求 缓存的设计(粒度和策略) 缓存的容量和基础设施 二.缓存分类和应用场景 本地缓存:编程实现(成员变量,局部变量,静态变量).Guava Cache 分布式缓存:Memcache.Redis 三.常用组件 Guava Cache public class Guava…
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…