java多线程编程核心技术(二)--对象及变量的并发访问
1、方法内部的私有变量是线程安全的,实例变量是线程不安全的。
2、A线程先持有object对象的lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法。
3、A线程先持有object对象的lock锁,B线程如果调用object对象中的synchronized类型的方法,则需要等待,也就是同步。
4、脏读:在多线程中,发生脏读的情况是在读取实例变量时,此值已经被其它线程修改过。
5、锁重入:在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时可以再次得到该对象的锁。
这也证明,在一个synchronized方法/块的内部调用本类的其它synchronized方法/块时,是可以得到锁的。
当存在父子类继承关系时,子类可以通过“可重入锁”调用父类的同步方法
6、当一个线程执行的代码出现异常时,其所持有的锁会自动释放
7、同步不可以继承,父类的同步方法,子类重写之后也要加上synchronized才会有同步效果
8、同步代码块,同步代码块比同步方法拥有更小纬度的同步,所以拥有更高的执行效率
9、同步代码块和同步方法一样,都是锁定的当前对象
10、多个线程调用一个同步方法的顺序是随机的
11、静态同步方法持有的是Class锁。
12、在JVM中具有String常量池缓存的功能,如果使用字符串变量作为锁,当两个变量的值相同时,就会造成两个线程持有相同的锁,后面的线程无法执行。这就是String常量池带来的问题
13、只要对象不变,即使对象的属性发生改变,运行的结果还是同步。
14、volatile关键字的作用是使变量在多个线程中可见。
15、volatile和synchronized的比较
1、volatile是线程同步的轻量级实现,性能比synchronized好,volatile只能修饰变量,synchronized可以修饰方法和代码块。
2、多线程访问volatile不会发生阻塞,synchronized会阻塞
3、volatile能保证数据的可见性,但不能保证原子性。synchronized可以保证原子性,并可以间接保证可见性。
16、变量在内存中的工作过程如下图

17、可以使用原子类Atomic来保证i++等操作的原子性
java多线程编程核心技术(二)--对象及变量的并发访问的更多相关文章
- Java多线程编程核心技术(二)对象及变量的并发访问
本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...
- Java多线程编程核心技术(三)多线程通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- Java多线程编程核心技术(一)Java多线程技能
1.进程和线程 一个程序就是一个进程,而一个程序中的多个任务则被称为线程. 进程是表示资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位. 举个例子: 打开你的计算机上的任务管 ...
- Java多线程编程核心技术---对象及变量的并发访问(二)
数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...
- Java多线程编程核心技术-第2章-对象及变量的并发访问-读书笔记
第 2 章 对象及变量的并发访问 本章主要内容 synchronized 对象监视器为 Object 时的使用. synchronized 对象监视器为 Class 时的使用. 非线程安全是如何出现的 ...
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- Java多线程编程核心技术
Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...
- 《Java 多线程编程核心技术》- 笔记
作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...
- 《java多线程编程核心技术》不使用等待通知机制 实现线程间通信的 疑问分析
不使用等待通知机制 实现线程间通信的 疑问分析 2018年04月03日 17:15:08 ayf 阅读数:33 编辑 <java多线程编程核心技术>一书第三章开头,有如下案例: ...
- 《Java多线程编程核心技术》知识梳理
<Java多线程编程核心技术> @author ergwang https://www.cnblogs.com/ergwang/ 文章末尾附pdf和png下载链接 第1章 Java多线程技 ...
随机推荐
- mac更改本地mysql登陆密码
安装完mysql 之后,登陆以后,运行任何命令,提示 You must SET PASSWORD before executing this statement解决办法. step 1: SET PA ...
- HBuilder发行原装安装包操作记录
1.在左侧"项目管理器"中选择项目: 2.点击菜单栏中的"发行-->发行为原生安装包": 3.在弹出的App云端打包中填写相关信息: IOS开发者证书配置 ...
- ASP.NET Core&EF 笔记
首先创建Asp.net Core项目,然后通过 NuGet 安装 EntityFrameworkCore: Microsoft.EntityFrameworkCore.SqlServer Micros ...
- PMBOK项目管理九大知识领域和五大流程 --美国IT项目管理硕士笔记(二)
PMBOK 项目管理 九大知识领域和五大流程 PMI Project Management Institute.PMI 是世界上最大的非盈利机构,是项目管理领域的领导者.PMI制定项目管理行业标准 ...
- iframe子页面让父页面跳转 parent.location.href
if ($roleNum < 9) { echo "<script > parent.location.href='admin_login.php' </script ...
- Tcl之Math
expr is for Tcl to do math operations. It takes all of its arguments ("2 + 2" for example) ...
- CPU位数、操作系统位数、机器字长、C/C++基本数据类型长度
1.CPU位数=CPU中寄存器的位数=CPU能够一次并行处理的数据宽度(位数)=数据总线宽度: //现在的计算机处理器一般都是64位,这是硬件的事. 2.CPU为了实现其功能设计了指令集,即是CPU的 ...
- Crash (computing)
In computing, a crash (or system crash) occurs when a computer program, such as a software applicati ...
- 梦想CAD控件打印相关
一.打印设置 在顶部快速访问工具栏单击打印按钮或者直接输入PLOT命令或者点击打印控制的打印设置按钮打开打印对话框.c#代码实现如下: //打印设置 private void Print1() { ...
- 04C语言输入输出
C语言输入输出 输入字符getchar() #include <stdio.h> int main(){ putchar(getchar()); putchar(getchar()); ; ...