Java-对象及变量的并发访问小结
1)多线程环境下,方法内的变量是线程安全的
2)多个线程同时处理一个实例,这个实例内的变量是不安全的
3)不同线程中注入同一个类的不同实例,实例中的变量是安全的
4)Synchronized获取到的锁是对象锁,当多个线程访问同一个对象时,哪个线程先执行带Synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,其他线程是等待状态
5)调用关键字Synchronized声明的方法一定是排队运行的,另外,只有共享资源的访问才需要同步化
6)一个对象内有多个Synchronized方法/块时
A)A线程先持有object对象的锁,B线程可以以异步的方式调用object对象的非Synchronized方法
B)A线程先持有object对象的锁,B线程如果此时调用object对象中的任一Synchronized方法,则需要等待A线程释放锁,也就是同步
7)实例中有两个变量,有一个Synchronized声明的方法,方法执行过程中,若一个变量赋值完成,一个变量未赋值完成,此时调用实例中非Synchronized方法去获取实例中两个变量的值,此时就会出现脏读,解决的办法是读取的方法上也加入Synchronized声明
8)Synchronized是对象锁,A线程获取到对象锁时,可执行被Synchronized声明的X方法,其他线程想要执行这个对象的任何被Synchronized声明的方法都得等待A释放,因为其他线程未获取到锁
9)Synchronized锁重入,在使用Synchronized时,当一个线程得到对象锁时,在此请求此对象的对象锁可以再次得到该对象的锁,一个Synchronized方法/块内部,可以调用本类的其他Synchronized方法/块(也就是说只要不释放,能够一直获取本实例的锁)
10)Synchronized不能继承,举个栗子,父类方法被Synchronized修饰,子类覆写父类的该方法,但并不带Synchronized修饰,就不会产生同步的效果
11)Synchronized代码块,肯定比Synchronized方法性能要好一些,也就是说Synchronized后面大括号,包裹的代码越少越好。当一个线程在执行Synchronized代码块时,其他线程可以执行这个代码块外部的代码
12)Synchronized代码块与Synchronized方法特性基本相同
13)任意对象都可以作为对象监视器,可以Synchronized(任意对象),优点:如果一个类中有很多个Synchronized方法,这时虽然能够实现同步,但会受到阻塞,所以影响运行效率;但如果使用同步代码块锁非this对象,则Synchronized(非this)代码块的程序与同步方法是异步的,不与其他锁this同步方法争抢this锁,可大大提高运行效率
A)当多个线程同时执行Synchronized(X,非this)同步代码块时呈同步效果
B)当其他线程执行X对象中Synchronized同步方法时也呈同步效果
C)当其他线程执行X对象方法里面的Synchronized(this)时也呈同步效果
14)Synchronized可以用在static关键字之上,表示对当前类持锁,class锁。class锁可以对类的所有对象实例起作用。也就是说,对于class A来说,即便多个线程中每个线程创建一个A的实例,只要他们调用的是A中static synchronized的方法(或者static方法中的synchronized代码块),就得等着,就是同步
15)通常情况下,都不会将String作为锁对象,因为String存在一个常量池,当两个线程调用的String相等时,相当于是竞争同一个锁;另外,当锁住某个String变量时x,若同步方法内对x进行了更改,相当于锁对象就变化了,其他再来竞争锁就能竞争到,就起不到同步的效果了(需要注意的是,只要对象不变,即便对象的属性发生变更,也是同步的,String是因为其池化导致的一系列不同)
16)当一个synchronized方法中出现死循环时(永远都不会释放锁),其他调用改对象中synchronized方法的线程均会一直等下去,解决方法是尽量每个方法锁不同的对象,而不是都锁this
17)死锁,一个方法,先锁A,等一会再锁B;另一个方法,先锁B,等一会再锁A;当两个方法同时执行时,就出现死锁了。
18)volatile的主要作用是使变量在多个线程间可见。原理是强制线程从公共堆栈中获得变量的值,而不是从线程的私有堆栈中取值。(举个栗子:当JVM设置为-server模式时,为了线程运行的效率,线程一直在私有堆栈中取值,这样,在一个while(x)的循环中,就算外部将x设置为false,线程内也不会跟着改变,从而进入到死循环状态,这是就需要用到volatile关键字了。volatile主要使用的场合是在多个线程中,可以感知实例变量被改变了,并且获得最新的值使用)
19) volatile本质上解决的是私有堆栈与公共堆栈中的值不同步
20)volatile与synchronized的异同
A)volatile是线程同步的轻量级实现,性能要比synchronized好;volatile只能修饰变量,而synchronized可以修饰方法或者代码块,synchronized还有性能提升的空间
B)使用volatile不会产生阻塞,而使用synchronized会产生阻塞
C)volatile保证可见性,但不保证原子性;synchronized保证原子性,间接保证可见性(一个变量只能在同步中操作完成了,才能被其他线程操作,所以叫间接)
D)volatile解决的是变量在多个线程之间的可见性,而synchronized解决的是多个线程访问资源的同步性
21)synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法或者某一代码块,它包含两个特性:互斥性和可见性。不进可以解决一个线程看到对象处于不一致状态,还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前的所有的修改效果。
Java-对象及变量的并发访问小结的更多相关文章
- Java多线程编程核心技术-第2章-对象及变量的并发访问-读书笔记
第 2 章 对象及变量的并发访问 本章主要内容 synchronized 对象监视器为 Object 时的使用. synchronized 对象监视器为 Class 时的使用. 非线程安全是如何出现的 ...
- Java多线程——对象及变量的并发访问
Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...
- Java——多线程之对象及变量的并发访问
Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...
- Java多线程编程核心技术---对象及变量的并发访问(一)
synchronized同步方法 "非线程安全"其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是"脏读",也就是渠道的数据其实是被更改 ...
- Java多线程编程核心技术(二)对象及变量的并发访问
本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...
- Java多线程编程核心 - 对象及变量的并发访问
1.什么是“线程安全”与“非线程安全”? “非线程安全”会在多个线程对同一对象总的实例变量进行并发访问时发生,产生的后果是“脏读”,也就是取到的数据其实是被更改过的. “线程安全”是以获得的实例变量的 ...
- 对象及变量的并发访问(同步方法、同步代码块、对class进行加锁、线程死锁)&内部类的基本用法
主要学习多线程的并发访问,也就是使得线程安全. 同步的单词为synchronized,异步的单词为asynchronized 同步主要就是通过锁的方式实现,一种就是隐式锁,另一种是显示锁Lock,本节 ...
- 对象和变量的并发访问synchronized解析以及死锁分析排查
一.synchronized java并发编程中存在“非线程安全"问题.“非线程安全"是指发生在多个线程对同一个对象中的实例变量并发访问时,产生的”脏读“现象,使用synchron ...
- (二)对象以及变量的并发访问--synchronized的使用细节,用法
具体的记录synchronized关键的各种使用方式,注意事项.感觉一步一步跟我来都可以看懂滴 大致是按照以下思路进行书写的.黑体字可以理解为结论, 1.synchronized锁的是什么? 2.sy ...
- 《JAVA多线程编程核心技术》 笔记:第二章:对象及变量的并发访问
一.基本概念1.安全的变量和不安全的变量2.脏读的理解3.锁重入:4.锁释放5.死循环:二.synchronized 的理解:三.synchronized 同步方法3.1 同步方法不具有继承性.3.2 ...
随机推荐
- 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数。
问题: 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 1.插入一个字符 2.删除一个字符 3.替换一个字符 格式: 输入行输 ...
- jwt、session、oauth 异同
1,jwt 和session机制 首先jwt 和session机制 都是用户认证的,oauth 不是 session 的流程: 1.用户向服务器发送用户名和密码. 2.服务器验证通过后,在当前对话(s ...
- iOS 开发中字典和字符串的转换
1.字符串转字典 NSString * jsonString = @""; NSData *jsonData = [jsonString dataUsingEncoding:NSU ...
- javaweb中的文件上传的一般写法(初次接触时写)
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1. 通过form表单向后端发送请求 <form id=&quo ...
- 查看webdriver API
pydoc是Python自带的模块,主要用于从python模块中自动生成文档 生成web页面文档: cmd->python -m pydoc -p 8888 -p:在本机上启动服务 8888:端 ...
- SEED实验——Environment Variable and Set-UID Program实验描述与实验任务
第一部分:实验描述 该实验的学习任务是理解环境变量是如何影响程序和系统行为的.环境变量是一组动态命名的变量 第二部分:实验任务 2.1 任务一:操作环境变量 在这个任务中,我们研究可以用来设置和取消设 ...
- js图片预加载与延迟加载
图片预加载的机制原理:就是提前加载出图片来,给前端的服务器有一定的压力. 图片延迟加载的原理:为了缓解前端服务器的压力,延缓加载图片,符合条件的时候再加载图片,当然不符合的条件就不加载图片. 预加载 ...
- 杂_小技巧_将网页上的内容通过亚马逊邮箱传到kindle中
所需条件 1.kindle要联网 2.要有亚马逊邮箱 3.要有微信,电脑上或者手机上 操作步骤: 1.找到你想要传送到kindle上的文章网页 2.在微信中关注“亚马逊kindle服务号”并且按照里边 ...
- 弄懂JDK、JRE和JVM到底是什么
首先是JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bi ...
- [crypto][ipsec] 简述ESP协议的sequence number机制
预备 首先提及一个概念叫重放攻击,对应的机制叫做:anti-replay https://en.wikipedia.org/wiki/Anti-replay IPsec协议的anti-replay特性 ...