java多线程编程核心技术 2
- “非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是取到的数据其实是被更改过的。而“线程安全”就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象。
- “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了。
- 在两个线程访问同一个对象中的同步方法时一定是线程安全的。
- 关键字synchronized取得的锁都是对象锁,而不是一段代码或方法当作锁,哪个线程先执行带synchronized关键字的方法,哪个 线程就是持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象。但多个线程访问多个对象,则JVM会创建多个锁。
- 调用关键字synchronized声明的方法一定是排队运行的,只有共享资源的读写才需要同步化。
- A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法
A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronize类型的方法则需等待,也就是同步。 - 发送脏读的情况是在读取实例变量时,此值已经被其他线程更改过了。
- 关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象时是可以再次得到该对象的锁的。这也证明在一个synchroized方法内部调用本类的其他synchronized方法时,是永远可以得到锁的。
- 当存在父子类继承关系时,子类是完全可以通过“可重入锁”调用父类的同步方法的。
- 出现异常的锁被自动释放。
- 同步不能继承,所以还得在子类的方法中添加synchronized关键字。
- synchronized方法是对当前对象进行加锁,而synchronized代码块是对某一个对象进行加锁。
- 当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一段时间内只能有一个线程被执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
- 不在synchronized块中就是异步执行,在synchronized块中就是同步执行。
- 当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object钟所有其他synchronized(this)同步代码块的访问被阻塞,这说明synchronized使用的“对象监视器”是一个。
- 和synchronized方法一样,synchronized(this)代码块也是锁定当前对象的。
- 锁非this对象具有一定的优点:如果在一个类中有很多个synchronized方法,这时虽然能实现同步,但会受到阻塞,所以影响运行效率;但如果使用同步代码块锁非this对象,则synchronized(非this)代码块中的程序与同步方法是异步的,不与其他锁this同步方法争抢this锁,则可以大大提高运行效率。
- 多个线程调用同一个对象中的不同名称的synchronized同步方法或synchronized(this)同步代码块时,调用的效果就是按顺序执行,也就是同步的,阻塞的。
- 同步代码块放在非同步synchronized方法中进行声明,并不能保证调用方法的线程的执行同步/顺序性,也就是线程调用方法是顺序是无序的,虽然在同步代码块中执行的顺序是同步的,这样极易出现“脏读”问题。
- synchronized(非this对象x)格式的写法是将x对象本身作为“对象监视器”,这样就可以得出以下3个结果:
1)当多个线程同时执行synchronized(x){}同步代码块呈同步效果。
2)当其他线程执行x对象中synchronized同步方法时呈同步效果。
3)当其他线程执行x对象方法里面的synchroinzed(this)代码块时也呈同步效果。
但要注意,如果其他线程调用不加synchronized关键字的方法时,还是异步调用。
- synchronized关键字加到static静态方法上是给Class类上锁,而synchroinzed关键字加到非static静态方法上是给对象上锁。
- 异步的原因是持有不同的锁,一个是对象锁,另外一个是Class锁,而Class锁可以对类的所有对象实例起作用。
- 当string的多个值都是相同时候(aa),两个线程持有相同的锁,所以造成线程B不能执行。这就是String 常量池所带来的问题。因此大多数的情况下,同步synchronized代码块都不使用string作为锁对象,而改用其他,比如new object()实例化一个Object对象,但它并不放入缓存中.
- 因为同步的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成,是线程死锁。
- 进入jdk的bin目录,执行jps命令,获取线程run的id,再执行jstack -l run线程id。
- 在内置类中有两个同步方法,但使用的却是不同的锁,打印的结果也是异步的。
- 同步代码块synchronized(class2)对class2上锁以后,其他线程只能以同步的方式调用class2中的静态同步方法。
- 如果同时持有相同的锁对象,则这些线程之间就是同步的;如果分别获得锁对象,这些线程之间就是异步的。
- 只要对象不变,即使对象的属性被改变,运行的结果还是同步的。
- 关键字volatile的主要作用是变量在多个线程间可见。
- 关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。
- volatile关键字最致命的缺点是不支持原子性。
- 关键字volatile主要使用的场合是多个线程中可以感知实例变量被更改了,并且可以获得最新的值使用,也就是用多线程读取共享变量可以获得最新值使用。
read和load阶段:从主存复制变量到当前线程工作内存;
use和assign阶段:执行代码,改变共享变量值; store和write阶段:用工作内存数据刷新主内存对应变量的值;
- 对于用volatile修饰的变量,jvm虚拟机只是保证从主内存加载线程工作内存的值是最新的。
- 原子操作是不能分割的整体,没有其他线程能够中断或检查正常原子操作中的变量。
atomicInteger也不一定是安全的,虽然addAndGet()方法是原子的,但方法和方法之间的调用却不是原子的。解决这样的问题必须要用同步。
java多线程编程核心技术 2相关推荐
- java多线程编程同步方法_实践【Java多线程编程核心技术】系列:同步方法造成的无限等待...
本文实践来自于[Java多线程编程核心技术]一书! 同步方法容易造成死循环,如-- 类Service.java: package service; public class Service { syn ...
- 《Java多线程编程核心技术》——1.5节sleep()方法
本节书摘来自华章社区<Java多线程编程核心技术>一书中的第1章,第1.5节sleep()方法,作者高洪岩,更多章节内容可以访问云栖社区"华章社区"公众号查看 1.5 ...
- 《Java多线程编程核心技术》读书笔记
为什么80%的码农都做不了架构师?>>> <Java多线程编程核心技术>读书笔记. ###第一章 Java多线程技能 使用Java多线程两种方式. 继承Thread ...
- 《Java多线程编程核心技术》读后感(十一)
<Java多线程编程核心技术>读后感(十一) 方法join的使用 在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束.这时,如果主线 ...
- Java 多线程编程核心技术
课程介绍 多线程编程在最大限度利用计算资源.提高软件服务质量方面扮演着至关重要的角色,而掌握多线程编程也成为了广大开发人员所必须要具备的技能. 本课程以基本概念.原理方法为主线,每篇文章结合大量演示实 ...
- Java多线程编程核心技术-多线程基础使用
导语 想要学习一个新的技术就必须要无限的接近它,深入的了解它,了解一个东西的步骤就是由浅入深的去深入的了解它.下面这个专题博主会带着大家共同学习Java多线程的核心编程技术,从入门到深入,也欢迎大 ...
- 好读书不求甚解(一)Java多线程编程核心技术
第1章 Java多线程技能 第2章 对象及变量的并发访问 1 synchronized同步方法 2 synchronized同步代码块 3 volatile 第3章 线程间通信 1 等待通知机制 2 ...
- java多线程编程核心技术 pdf_Java多线程编程核心技术之volatile关键字
私信我或关注公众号猿来如此呀,回复:学习,获取免费学习资源包 volatile关键字 关键字volatile的主要作用是使变量在多个线程间可见. 1 关键字volatile与死循环 如果不是在多继承的 ...
- 《Java多线程编程核心技术》读后感(十四)
单例模式与多线程 立即加载/饿汉模式 立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接new实例化. 立即加载/饿汉模式实在调用方法前,实例已经被创建了 package Six;pu ...
- Java多线程编程核心技术 —— 拾遗增补
1.线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中. 线程状态,线程可以处于下列状态之一. NEW(new) 直接尚未启动的线程处于这种状态. RUNNABLE(runnab ...
最新文章
- Deployment,configuration and management Microsoft Windows Server win2003 cluster
- k3运行linux,首个Kubernetes操作系统k3OS,附主要功能介绍
- Java:switch语句例子
- lua实现继承(lua程序设计21.7 练习21.2题)
- html css a标签的应用
- uni-calendar更改打点颜色实现签到和缺勤不同打点颜色效果
- 栈溢出笔记1.1 函数调用过程
- curl请求命令url加引号
- 远洋渔船一次出海好几年,生活枯燥,那你在船上最开心的事是啥?
- 【渝粤教育】国家开放大学2018年秋季 1189T政府经济学 参考试题
- 云计算的小兄弟:雾计算和霾计算
- 搜狗收录方法之搜狗推送接口实现
- 会员等级图标js脚本
- 哈尔滨工业大学计算机科学与技术学院许博文,王轩-哈尔滨工业大学(深圳)计算机科学与技术学院...
- 输入一个年份和一个月份,输出该年此月天数;知道日期,计算该日是本年的第几天(c语言)
- 现代化个人博客系统 ModStartBlog v5.7.0 简约纯白主题,富文本大升级
- 国内常用的三种防火墙你接触过哪些?
- R2决定系数(Coefficient of Determination)
- 【安卓开发】DrawerLayout+ToolBar报错:DrawerLayout must be measured with MeasureSpec.EXACTLY.
- 音频基础知识 - PCM 浅析