Java并发编程艺术读书笔记

1、多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存。所以,可合理控制线程数量。 如何控制:

  (1)使用ps -ef|grep appname,查找appname的pid;如1111

  (2)使用jstack 1111 > /home/ibethfy/dump1,将dump信息追加到dump1

  (3)使用grep java.lang.Thread.State /home/ibethfy/dump1 | awk '{print $2$3$4$5}' | sort | uniq -c,统计查找线程状态个数。分析是否WAITING的线程过多。

  (4)查看这些WAITING的线程时怎么产生的,如某个服务创建线程池中线程过多,分析后对应修改。

  (5)重启后重新统计。

2、避免死锁几种常用方式

  (1)避免一个线程同时获取多个锁。

  (2)避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。

  (3)尝试使用定时锁,lock.tryLock(timeout)来替代内部锁机制。

  (4)对于数据库锁,加锁和解锁必须在同一个连接内,不然会造成解锁失败的情况。

3、volatile保证共享资源对其他线程的可见性。volatile修饰共享变量时,共享变量进行写操作时,会在汇编中多一个lock前缀的指令,该指定表示要将该变量从当前处理器的缓存行数据写到系统内存,写会内存操作会使其他CPU缓存了该内存地址的数据失效。其他CPU去获取该数据时,会从系统内存重新获取。

4、synchronized,JVM通过进入和退出Monitor对象来实现代码块和方法同步。代码块同步使用的是monitorenter和monitorexit来实现。在编译时,会将这两个指令分别插入到代码块开始和结束(包括正常和异常结束),在执行这两句指令时,会去进去和退出monitor对象。

5、锁在哪?Java的锁,是存在对象头的Mark Word中。存储一个锁地址,指向C++里面的一个ObjectMonitor对象,该对象存储了当前占用锁的线程,等待的线程,该线程重入的次数,锁状态等字段。

6、JMM,Java内存模型,用于控制Java线程之间的通信,和计算机多线程模型类似,也是为每个线程分配了类似的内存缓存,变量存在主内存中,要保证线程之间的通信,必须要保证线程A将数据从本地缓存刷新到主内存,线程B识别到数据更新,从主内存中取得最新数据。JMM主要就是控制主内存和线程本地内存之间的交互等。

7、JMM模型中,主要是解决有序性(顺序一致性),可见性,原子性。

  (1)由于多线程中,每个线程有自己的本地缓存,且在执行代码后,不知道何时回把缓存刷新到主内存,所以,线程的操作对其他线程是不可见的。这时不同线程获取共享变量就会出现不一致的问题。

  (2)指令的重排序:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。数据依赖性:某一行代码依赖上一行代码,这样不会进行这两条代码的重排序,多线程系统不会考虑该问题。顺序一致性:指令重排序后,最终执行结果要和顺序执行结果一致。

  (3)多线程之间进行了正确的数据同步,JMM保证多个线程的顺序一致性。

  (4)顺序一致性模型:一个程序的操作必须按照程序顺序执行。不管程序是否同步,所有线程都能按照单一的操作执行顺序。即多个线程的操作可以并行执行,但对于单个线程来看,他的指令时顺序执行的,且每条指令都对其他线程可见。

  (5)JMM不保证顺序一致性,即未同步的线程,执行顺序是无序的,且可能对其他内存不可见。这个时候,就需要同步来实现顺序一致性模型。synchronized修饰的代码块,在获得锁后才能执行,从而保证了多个线程的整体顺序执行,但同步块局部不依赖的指令,也可进行重排序(尽量给编译器或者优化器优化提供入口)。为什么JMM不保证未同步的线程的顺序一致性呢?主要是要保证会禁止大量的编译器等优化,严重影响性能,所以就提供同步方法来实现。

  (6)JMM内存可见性的保证:单线程不会出现内存可见性问题,编译器,runtime,处理器会共同保证期执行结果和顺序一致性模型结果一致;多线程,正确同步的多线程将具有顺序一致性,JMM通过限制编译器和处理器的重排序来提供内存可见性的保证。未同步或未正确同步的多线程,JMM为他们提供了最小安全性的保证,线程读取到的值,要么是之前线程写入的值,要么是初始值。

  (7)volatile,当写volatile时,其他读写指令在其之后执行,保证了有序性;当写时,会把新的缓存中的值写入到主内存;另一线程读时,会将本地缓存地址置为无效,从主内存中获取该值。

  (8)synchronized,当某线程获得锁时,其余线程等待,保证了有序性。当某线程释放锁时,会将本地缓存写入主内存,当另一线程获取锁时,会将本地缓存置为无效,从主内存获取数据。所以保证了多线程的顺序一致性和可见性。

  (9)happens-before规则。

8、wait和notify:WaitThread首先获取了对象的锁,然后调用锁对象的wait()方法,从而放弃了锁并进入了对象的等待队列WaitQueue中,进入等待状态。由于WaitThread释放了对象的锁,NotifyThread随后获取了对象的锁,并调用锁对象的notify()方法,将WaitThread从WaitQueue移到SynchronizedQueue中,此时WaitThread的状态变为阻塞状态。NotifyThread释放了锁之后,WaitThread再次获取到锁并从wait()方法返回继续执行。金典案例如下: synchronized(对象) {        

  while(条件不满足) {              

     对象.wait();      

    }      

    对应的处理逻辑

}

synchronized(对象) {

       改变条件        

  对象.notifyAll();

}

9、ThreadLocal:ThreadLocal,即线程变量,是一个以ThreadLocal线程对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。

10、CountDownLatch:

  (1)、初始化CountDownLatch cdl  = new CountDownLatch(5);

  (2)、同一线程或多个线程调用cdl.countDown(),使计数器减一,通过入参传入cdl;等待线程调用cdl.await(),阻塞等待cdl计数器等于0后,执行。

11、CyclicBarrier:

  (1)、初始化CyclicBarrier cb = new CyclicBarrier();

  (2)、其余线程调用cb.await(),告诉屏障我已到达,然后等待指定数量的线程都已到达后,然后统一往后执行。

  (3)、构造函数可传入另一线程,表示到达屏障的数量满足后,优先执行该方法。

12、Semaphore:Semaphore(10)表示允许10个线程获取许可证,也就是最大并发数是10。Semaphore的用法也很简单,首先线程使用Semaphore的acquire()方法获取一个许可证,使用完之后调用release()方法归还许可证。还可以用tryAcquire()方法尝试获取许可证。

13、Exchanger:用于线程间数据交换。

14、线程池技术:好处

  (1)降低系统消耗,重复利用线程

  (2)提高响应速度,不用重新创建线程

  (3)提高可管理性,可以实现对线程的管理。

线程池流程:

  (1)新来一个任务,如果没有超过核心线程数,则创建一个核心线程,执行任务,不管是否有闲置的核心线程,也会创建新的核心线程执行任务。

  (2)如果核心线程都处于运行状态,且数量已达上限,则判断工作队列是否已满,如果未满,则将任务加入工作队列,排队等待核心线程空闲后执行。

  (3)如果核心线程都在运行任务和工作队列都满了,则创建新的额外线程来执行任务。(额外线程由最大线程决定,且无用后会被回收)

  (4)额外线程也满了且都在执行的话,就采用拒绝策略拒绝请求。

线程池创建参数:

  (1)corePoolSize,核心线程数量。

  (2)runnableTaskQueue:任务队列,有ArrayBlockingQueue,基于数组的有界阻塞队列,FIFO;LinkedBlockingQueue,基于链表实现的阻塞队列,FIFO,吞吐量通常高于ArrayBlockingQueue,静态工厂方法Executors.newFixedThreadPool()使用了这个队列;SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于Linked-BlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列;

  (3)maximumPoolSize:线程池最大线程数,线程池允许创建的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是,如果使用了无界的任务队列这个参数就没什么效果。

  (4)ThreadFactory:用于设置创建线程的工厂;

  (5)RejectedExecutionHandler(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。以下四种策略: ·AbortPolicy:直接抛出异常。 ·CallerRunsPolicy:只用调用者所在线程来运行任务。 ·DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。 ·DiscardPolicy:不处理,丢弃掉

  (6)keepAliveTime(线程活动保持时间):线程池的工作线程空闲后(非核心线程会回收,allowCoreThreadTimeOut(true),设置这个属性,核心线程在超时未用后,也会被回收),保持存活的时间。所以,如果任务很多,并且每个任务执行的时间比较短,可以调大时间,提高线程的利用率。

  (7)TimeUnit(线程活动保持时间的单位);

转载于:https://www.cnblogs.com/ibethfy/p/10119329.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

您可能不需要翻译您JavaScript

by Alex Ewerlf由AlexEwerlf 您可能不需要翻译您JavaScript (You might not need to transpile your JavaScript) Popular guides like YouMightNotNeedJQuery.com and You Don’t Need Lodash/Underscore have challenged common industry practices.诸如YouMightNotNeedJQue…

java maven 操作 收集的一些命令

maven打包: mvn clean package -Dmaven.test.skiptrue 运行jar: java -jar target/spring-boot-scheduler-1.0.0.jar 这种方式关掉控制台就不可以访问,现在要后台运行的方式启动 nohup java -jar target/spring-boot-scheduler-1.0.0.jar & 清理并…

手机h5 java平台_H5 手机 App 开发入门:技术篇

1、手机 App 的技术栈手机 App 的技术栈可以分成三类原生 App 技术栈原生技术栈指的是,只能用于特定手机平台的开发技术。比如,安卓平台的 Java 技术栈,iOS 平台的 Object-C 技术栈或 Swift 技术栈。混合 App 技术栈混合技术栈指的是开发混合…

《Java程序设计》学期总结

《Java程序设计》 学期总结 课程设计小组 -迦瓦栈队 团队博客 读书笔记汇总第一周第二周第三周第四周第五周第六周第七周第八周第九周第十周 实验报告汇总实验一实验二实验三实验四实验五 代码托管链接GitOSC 课程收获与不足 上了一学期的课,收获当然后很多&#xf…

012-- mysql的分区和分表

分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中。 mysql支持的分区类型包括Range、List、Hash、Key,其中Range比较常用: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。 LIST分区:类…

中科大计算机专业少实习_为什么很少有计算机科学专业的人?

中科大计算机专业少实习Hong Kong-based technology writer Dan Wang wrote a blog post exploring why so few people get degrees in computer science. And yes — it’s far fewer people than those who study other science and engineering fields.驻香港的技术作家王丹…

java犯的小错误_[Java教程]十个JavaScript中易犯的小错误,你中了几枪?

[Java教程]十个JavaScript中易犯的小错误,你中了几枪?0 2015-06-01 12:00:19序言在今天,JavaScript已经成为了网页编辑的核心。尤其是过去的几年,互联网见证了在SPA开发、图形处理、交互等方面大量JS库的出现。如果初次打交道&…

Kali渗透测试——利用metasploit攻击靶机WinXP SP1

搭建渗透测试环境 Kali攻击机 WinXP SP1 靶机 启动metasploit 跟windows RPC相关的漏洞 内部提供的漏洞攻击 靶机winxp sp1网络配置 查看虚拟机的NAT网段 配置WinXP SP1靶机的IP地址 执行漏洞利用 后漏洞利用:meterpreter> 靶机的信息 进程情况 查看到explorer.e…

创建响应式布局的优秀网格工具集锦《系列五》

在这篇文章中,我们为您呈现了一组优秀的网格工具清单。如果网页设计和开人员采用了正确的工具集,并基于一个灵活的网格架构,以及能够把响应图像应用到到设计之中,那么创建一个具备响应式的网站并不一定是一项艰巨的任务。enjoy! 您…

【iOS - 周总结】开发中遇到的小知识点(2018.12.10-2018.12.15)

1.WKWebview加载html文本图片过大,没有自适应屏幕宽高。 在用Webview加载html文本有时候会遇到加载的图片过大,不能自适应屏幕宽高的问题。那么如何解决这个问题?如何使图片自适应屏幕?很简单,只需要加一个js就可以。 …

如何使用Create React App DevOps自动化工作中所有无聊的部分

by James Y Rauhut詹姆士鲁豪(James Y Rauhut) 如何使用Create React App DevOps自动化工作中所有无聊的部分 (How I automate all of the boring parts of my job with Create React App DevOps) When you have responsibilities as one of the only designers — and possib…

java 无侵入监控_MyPerf4J 一个高性能、无侵入的Java性能监控和统计工具

MyPerf4J一个针对高并发、低延迟应用设计的高性能且无侵入的实时Java性能监控和统计工具。 受 perf4j 和 TProfiler启发而来。MyPerf4J具有以下几个特性:无侵入: 采用JavaAgent方式,对应用程序完全无侵入,无需修改应用代码高性能: 性能消耗非…

Apple Swift编程语言新手教程

文件夹 1 简单介绍2 Swift入门3 简单值4 控制流5 函数与闭包6 对象与类7 枚举与结构1 简单介绍 今天凌晨Apple刚刚公布了Swift编程语言,本文从其公布的书籍《The Swift Programming Language》中摘录和提取而成。希望对各位的iOS&OSX开发有所帮…

javascript 减少回流

减少回流(REFLOWS) 当浏览器重新渲染文档中的元素时需要 重新计算它们的位置和几何形状,我们称之为回流。回流会阻塞用户在浏览器中的操作,因此理解提升回流时间是非常有帮助的。 回流时间图表 你应该批量地触发回流或重绘&#x…

[国家集训队] 特技飞行

题目背景 1.wqs爱好模拟飞行。 2.clj开了一家神犇航空,由于clj还要玩游戏,所以公司的事务由你来打理。 注意:题目中只是用了这样一个背景,并不与真实/模拟飞行相符 题目描述 神犇航空开展了一项载客特技飞行业务。每次飞行长N个单…

react 手指移开_代码简介:React的五个死亡手指

react 手指移开Here are three stories we published this week that are worth your time:这是我们本周发布的三个值得您关注的故事: React’s Five Fingers of Death. Master these five concepts, then master React: 10 minute read React的五指死亡。 掌握这五…

java lock接口_Java Lock接口

Java Lock接口java.util.concurrent.locks.Lock接口用作线程同步机制,类似于同步块。新的锁定机制更灵活,提供比同步块更多的选项。 锁和同步块之间的主要区别如下:序列的保证 - 同步块不提供对等待线程进行访问的序列的任何保证,…

springcloud-05-ribbon中不使用eureka

ribbon在有eureka的情况下, 可以不使用eureka, 挺简单, 直接上代码 application.xml server:port: 7002 spring:# 设置eureka中注册的名称, 全小写, 否则大小写混杂出现问题application:name: microservice-consumer-movie-ribben-ymllogging:level:root: INFOorg.hibernate: I…

SQL mysql优化

慢查询 如何通过慢查日志发现有问题的SQL? 查询次数多且每次查询占用时间长的SQL pt-query-digest分析前几个查询IO大的SQL pt-query-diges分析中的Rows examine项未命中索引的SQL pt-query-digest分析中Rows examine 和Rows Send的对比如何分析SQL查询 使用explain…

转: 关于 ssl的建立链接的过程

转自: http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html SSL/TLS协议运行机制的概述 作者: 阮一峰 日期: 2014年2月 5日 互联网的通信安全,建立在SSL/TLS协议之上。 本文简要介绍SSL/TLS协议的运行机制。文章的重点是设计思…