1 线程安全

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

2 局部变量并不会数据共享

局部变量,不同线程的并不共享,所以并不会发生覆盖

PrivateNum p=new PrivateNum();

MyThread threadA=new MyThread('A',p);

MyThread threadB=new MyThread('B',p);

threadA.start();

threadB.start();

public void test( char i) {

try {

int num=0;

- - - - - - -

}

catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}}

3 实例成员变量数据共享

PrivateNum p=new PrivateNum();

MyThread threadA=new MyThread('A',p);

MyThread threadB=new MyThread('B',p);

threadA.start();

threadB.start();

public void test( char i) {

int num=0;

try {

- - - - - - -

}

catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}}

线程AB访问的是同一个变量(指向同一个地址),所以这个时候会发生覆盖,同时这里出现了线程安全问题

4 synchronized关键字可以避免线程安全问题

如果多个线程访问的是同一个对象方法中的局部变量,那么这个变量并不共享,线程AB对此变量的操作将互不影响

如果多个线程访问的是同一个对象方法中的成员变量,那么这个变量共享,如果不处理好线程问题,可能会出现线程安全问题

通过synchronized关键字可以使方法同步

5 多个线程访问的是两个不同实例的同一个同步方法

public static void main(String[] args) {

PrivateNum p1=new PrivateNum();

PrivateNum p2=new PrivateNum();

MyThread threadA=new MyThread('A',p1);

MyThread threadB=new MyThread('B',p2);

threadA.start();

threadB.start();

}}

这是因为这里是两个锁,创建了p1和p2对象,创建的是两个锁,锁对象不同不造成互斥作用

6 多线程调用同一个实例的两个不同(一个同步,一个非同步)方法

MyThread threadA=new MyThread('A',p1);

MyThread2 threadB=new MyThread2('B',p1);

threadA.start();

threadB.start();

线程B可以异步调用非同步的方法

7 死锁

线程AB开始执行时,因为锁不同,所以不互斥,A当执行到另一个同步代码块(锁2)的时候,由于这个时候锁给线程B占有了,所以只能等待,同样B线程也是如此,AB互相抢对方的锁,但是所以造成了死锁

8 总结

多个线程调用的不同实例的同步方法,线程不互斥。

如果两个线程的锁对象一样(都是p1),两个线程分别调用同步方法和非同步方法,线程不会同步执行。

但是如果调用两个不同的同步方法,因为锁对象一致,两个线程同步执行。

设想一个情况,有一个实例有两个方法,一个修改值(synchronized),一个读值(非synchronized),此时两个线程一个修改值,一个读取值,这个时候因为这两个线程并不会挣抢锁,两个线程互不影响,那么此时可能就会出现一种情况,线程A还没修改完,线程B就读取到没有修改的值。这就是所谓的脏读。

重入锁,一个获得的锁的线程没执行完可以继续获得锁。

线程占用锁的时候,如果执行的同步出现异常,会将锁让出。

父类方法同步,子类重写该方法(没有synchronized关键字修饰),是没有同步作用的。

同步代码块的锁对象可以是本对象,也可以是其他对象。同一个锁对象可以产生互斥作用,不同锁对象不能产生互斥作用

一个方法中有同步代码块和非同步代码块,同步代码块的代码是同步执行的(块里的代码一次执行完),而非同步代码块的代码可以异步执行

一个对象中的不同同步代码块是互斥的,执行完一个代码块再执行另一个代码块

同步代码块(this)和synchronized方法的锁定的都是当前对象 this

Class类也可以是锁,Class锁的实现可以通过静态的synchronizd方法,也可以通过静态方法里面的同步代码块(锁对象为Class)

静态类的同步方法锁对象还是该类的一个实例

volitate增加了实例变量在对个线程之间的可见性,保证我们获得的是变量的最新值。

volatile在读上面保持了同步作用,但是在写上面不保持同步

synchronized的同步作用不仅保证了对同一个锁线程的互斥,还保证了数据的同步

volatile对比synchronized

两者修饰的不同,volatile修饰的是变量,synchronized修饰的是方法和代码块

两者的功能不同。volatile保证数据的可见性,synchronized是线程同步执行(间接保证数据可见性,让线程工作内存的变量和公共内存的同步)

volatile性能比synchronized性能高

java并发访问_Java并发访问相关推荐

  1. java并发排它锁_Java并发编程进阶——锁(解析)

    一.锁是什么 java开发中进行并发编程时针对操作同一块区域时,如果不加锁会出现并发问题,数据不是自己预计得到的值.我觉得有点像mysql事务中脏读.不可重复读.幻读的问题.加锁的目的是为了保证同一时 ...

  2. java并发常量_Java并发编程-常量对象(七)

    在创建后状态不再发生改变的对象称作常量对象(Immutable Objects).常量对象其可靠性使其广泛地用作开发简单可靠代码的策略.常量对象在开发并发程序中非常有用.由于创建后不能被改变状态,它们 ...

  3. java 方法权限_Java控制访问权限的方法

    这篇博客主要用来介绍Java中的访问权限. 引入访问控制权限 我们都知道,一个通用类库(如:JDK)开发出来的目的是让普通开发者重用以节省开发时间与精力,但是类库的设计不可能在刚开始就尽善尽美,普通开 ...

  4. java线程安全性_Java并发-线程安全性

    1.什么是线程安全性? 在线程安全性的定义中,最核心的就是正确性.当多线程访问调用某个类时,线程之间不会出现错误的交互,不管运行时线程如何交替执行,并且在主调代码不需要任何同步或协同,这个类都能表现出 ...

  5. java的并发框架_java并发框架有哪些

    展开全部 Java并发框架java.util.concurrent是JDK5中引入到标准库中的(采用的32313133353236313431303231363533e78988e69d8331333 ...

  6. java并发编程_Java并发编程之 synchronized

    大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下Java中内存泄漏如何分析解决的相关知识,今天跟大家分享Java之 sync ...

  7. java lock 对象_Java并发编程锁系列之ReentrantLock对象总结

    Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...

  8. java计算时间差_JAVA并发编程三大Bug源头(可见性、原子性、有序性),彻底弄懂...

    原创声明:本文转载自公众号[胖滚猪学编程]​ 某日,胖滚猪写的代码导致了一个生产bug,奋战到凌晨三点依旧没有解决问题.胖滚熊一看,只用了一个volatile就解决了.并告知胖滚猪,这是并发编程导致的 ...

  9. java 并发锁_Java并发教程–锁定:内在锁

    java 并发锁 在之前的文章中,我们回顾了在不同线程之间共享数据的一些主要风险(例如原子性和可见性 )以及如何设计类以安全地共享( 线程安全的设计 ). 但是,在许多情况下,我们将需要共享可变数据, ...

最新文章

  1. 项目管理中如何进行多方合作
  2. 每日一皮:键盘未找到的窘境...
  3. Python 入门篇-最新版python3.7.2的安装。
  4. MySQL数据库:存储引擎
  5. OpenGL 统一变量uniform
  6. iOS开发缓存机制之—内存缓存机制
  7. 微软官方pe工具_微软官方下载工具
  8. Java探索之旅(2)——GUI输入输出与代码的规范性
  9. php 查询cpu使用率,php获取CPU使用情况的代码
  10. csdn中下载资源入口查找
  11. 中国塑料杯市场需求预测与发展前景分析报告2022-2027年
  12. Flask+SQLAlchemy+graphene+docker示例
  13. C语言中IO模型实现并发服务器
  14. HDS USPV-VSP HP XP24000 Raid崩溃阵列损坏多盘损坏数据恢复方法思路分享
  15. oliver什么意思java_Oliver是什么意思?
  16. 程序员与代码之间的搞笑日常,笑的人肚子痛!
  17. java浮点数减法_浮点数的相关运算Java实现
  18. 重学JS(一):什么是枚举?
  19. #企业要求程序员统一电脑桌面,网友:桌面壁纸都不配拥有?
  20. 全球及中国聚氨酯热固性弹性体(TSU)行业研究及十四五规划分析报告

热门文章

  1. 提高C++程序运行效率的10个简单方法
  2. Spark 运行内存不足Not enough space to cache rdd in memory,Container killed by YARN for exceeding memory
  3. 开课啦 dubbo-go 微服务升级实战
  4. PyFlink + 区块链?揭秘行业领头企业 BTC.com 如何实现实时计算
  5. 阿里风控大脑关于大数据应用的探索与实践
  6. ECS事件通知之创建失败事件
  7. 利用Serverless Kubernetes和Kaniko快速自动化构建容器镜像
  8. 二十分钟教你如何将区块链应用与函数计算相结合 1
  9. 重磅发布!阿里云推PostgreSQL 10 高可用版
  10. 阿里面试官整理的JVM面试要点,99%的你都不知道!