第二章 对象以及变量的并发访问
synchronied 对象监视器为Object时的使用,或者监视器为Class时的使用。
方法中的变量不存在非线程安全问题,永远都是线程安全的,这是方法内部的变量是私有的特性造成的。
1 synchronized的使用
在方法前加关键字synchronized即可。
1)A线程先持有object对象的Lock锁,B线程可以异步的方式调用object对象中的非synchrionized类型的方法。
2)A线程先持有object对象的Lock锁,B线程如果在这时调用了object对象中的synchrionized类型的方法则需要等待,也就是同步。
2 脏读
每个方法都加synchronized解决
3 锁重入
synchronized方法/块内部调用其他synchronized方法/块的时,是永远得到锁的。
“可重入锁”的概念是:自己可以再次获得自己的内部锁。比如有一条线程获得了某个对象的锁,此时这个对象还没有释放,当其再次想获得这个对象的锁的时候还是可以获得的,如果不可锁重入的话,就会造成死锁。
出现异常,锁就会自动释放。
同步不具有继承性,应该是发生在重写的情况下
4 synchronized同步代码块
当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一段时间内只能有一个线程被执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块以后才能执行该代码块。
在使用同步synchronized(this)代码块时需要注意的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object中所有其他synchronized(this)同步代码块的访问被阻塞,这说明synchronized使用的“对象监视器”是一个。
关键字synchronized还可以运用在static静态方法上,如果这样写,那是对当前的*.java文件对应的Class类上锁。
从运行效果上看,并没有说明特别之处,都是同步的效果,和将sychronized关键字加到非static方法上使用的效果是一样的。而sychronized关键字加到非static静态方法上是给对象上锁。
数据类型String的常量池特性:在JVM中具有String常量池缓冲的功能,将
synchronized(String)同步块与String联合使用时,要注意带来的一些意外。一般不使用
同步方法容易造成死循环,用同步块试一下
5 内置类
public class PublicClass{
class PrivateClass{
}
}
PublicClass pubc = new PublicClass();
PrivateClass pric = pubc.new PrivateClass;
还有一种静态内置类
public class PublicClass{
static class PrivateClass{
}
}
本实验测试同步代码块sychronized(class2)对class2上锁后,其他线程只能以同步的方式调用class2中的静态方法
6 volatile 关键字
主要作用是使变量在多个线程间可见,但不支持原子性
i++问题
1)从内存中取出i的值;
2)计算i的值;
3)将i的值写到内存中。
对于用volatile修饰的变量,JVM虚拟机只是能保证从主内存中加载到线程工作内存的值是最新的,例如线程1和线程2在进行read和load的操作中,发生主内存中的count的值都是5,那么都会加载这个最新的值,也就是说volatile关键字解决的是变量读时的可见性问题,但无法保证原子性,对于多个线程访问同一个实例变量还是需要加锁同步。
使用原子类进行i++操作,除了操作时使用synchronized关键字实现同步外,还可以使用AtomicInt类进行实现。
sychronized代码块有volaite同步的功能:
` 关键字synchronized可以使用多个线程访问同一个资源具有同步性,而且它还具有将线程工作内存中的私有变量与公共内存中的变量同步的功能。
转载于:https://www.cnblogs.com/ljy-1471914707/p/7956136.html
第二章 对象以及变量的并发访问相关推荐
- 两个线程同时访问一个变量_百战程序员:Java多线程对象及变量的并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- java 并发变量_二、Java多线程编程 (对象及变量的并发访问)
非线程安全 多个线程对同一个对象中的实例变量进行并发操作时会出现值被更改.值不同步的情况,进而影响程序的执行流程. 线程安全 线程安全就是获得实例变量的值是经过同步处理的.不会出现被更改不同步的情况. ...
- 对象及变量的并发访问(案例加总结)--学习笔记
文章目录 前言 一.synchronized的使用? 1.0.1 实际变量非线程安全及解决 1.0.2 当类中存在同步方法与非同步方法时(synchronized锁的是对象,而非方法) 1.0.3 s ...
- 对象及变量的并发访问一
一.多个线程操作一个对象实例 当两个线程同时访问一个没有同步的方法,如果两个线程同时操作业务对象中的实例变量,则有可能会出现"非线程安全问题". 1 package concur ...
- javascript进阶教程第二章对象案例实战
javascript进阶教程第二章对象案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过案例练习补充几个之前没有见到或者虽然讲过单是讲的不仔细的知识点. 二.具体实例 温馨提示 面向对象的知 ...
- C语言基础教程读书笔记2(第二章常量、变量、类型转换)
第二章常量.变量.类型转换<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...
- 吴恩达机器学习(第二章)——单变量线性回归
第二章-单变量线性回归 文章目录 第二章-单变量线性回归 模型描述 代价函数 梯度下降 梯度下降的思想 梯度下降算法的公式 梯度下降的运动方式 线性回归的梯度下降 模型描述 在监督学习中我们有一个数据 ...
- Java-对象及变量的并发访问小结
1)多线程环境下,方法内的变量是线程安全的 2)多个线程同时处理一个实例,这个实例内的变量是不安全的 3)不同线程中注入同一个类的不同实例,实例中的变量是安全的 4)Synchronized获取到的锁 ...
- 第二章python基础 变量和注释菜鸟笔记
1.变量的定义:变量名=对象 (变量名其实就是对象的名字) cn='我喜欢python' print(cn) print(cn)print(cn) print(cn) 这样就不用一个一个写了,可以直接 ...
- 吴恩达机器学习学习笔记第二章:单变量线性回归
模型描述: 训练集(training set):是监督学习中独有的概念,由我们人喂给电脑的既有既有特征x又有结果y的数据.下图x是房子面积 ,y是房屋对应的价格 符号记法解释: (x^(1),y^(1 ...
最新文章
- linux打开应用程序的命令,Windows环境下如何通过命令打开程序!
- Python技术分享:numpy库的安装教程
- 【机器视觉】 dev_map_par算子
- Android官方开发文档Training系列课程中文版:动画视图之场景创建
- python最佳框架_Web开发的10款最佳Python框架
- 东大oj-1591 Circle of friends
- MySQL开启命令自动补全功能(auto-rehash)
- Linux环境变量PSI指什么,psi是什么单位(pSI指标应用原则)
- win7 mysql 应用程序无法启动因为应用程序的并行配置不正确
- access/sql server笔记(20160818)
- 模式识别研究生:三维点云从零开始学习
- MySQL数据库基础-----多表查询
- Spring Boot--Druid连接池的配置方法
- [HL7_V2.4]HL7消息生成和反射
- 最适合初学者编写的完整指纹锁代码
- 沪江计算机考研老师,[回报沪江]从六级370到考研74,我的08研英之路[原创].doc
- VTK从分割好的体数据获取等值面的方法(MarchingCube)
- 「镁客·请讲」bitBerg杨坤:冰山下藏着的是VR游戏的未来
- 对于dpc的初步理解
- Linux vim编辑文件查找指定的字符串
热门文章
- python面向对象的编程_不会面向对象,肯定学不好Python!简易的面向对象攻略来啦...
- 论坛apache伪静态_修正PostViews插件加入CDN静态缓存后计数不正常问题
- FISCO BCOS java sdk 组装交易的代码位置
- 零知识证明四——Fiat-Shamir,三分钟零知识证明入门
- 微信小程序云开发教程-微信小程序的JS基础-视图层数据更新
- java blowfish ecb,node.js – 使用nodejs crypto和php的mcrypt解密blowfish-ecb
- 基于SSM的超市积分管理系统
- linux系统pdf目录编辑器,Linux操作系统(三)编辑器与实用程序.pdf
- javascript及css实现居中效果
- text-transform 文本大小写转换、input checkbok 大小设置、letter-spacing 设置字符间距