多线程2-对象及实例变量的并发访问

对象及实例变量的并发访问。

  • 所谓实例变量是指一个对象的属性。
  • 多线程在访问同一个对象的实例变量时,会出现“非线程安全问题”。
  • 多线程在访问局部变量是线程安全的。

    不应该在各个线程中new出对象,一是不符合生产场景(使用场景都是对同一个对象进行并发处理,哪里会有在开多线程的时候重新在线程New出当前使用的对象的),二是没有意义(new出的对象各自完成逻辑处理,也线程不存在安全不安全之说)。

多个线程调用同一个对象的不同方法。

1- 方法全部未同步
随机调用,且是异步调用
2、一个被同步一个未同步
调用同步方法的线程先加锁。但调用未同步方法的线程可以异步加载。
3、方法全部被同步
随机顺序执行第一个同步的线程。该线程获得当前方法的lock。若此时其它线程调用其它同步方法,需等待以加锁方法全部执行完释放lock。

总结:1、当线程A调用对象C的同步方法X时,若线程B也调用对象C的方法X,因为线程A先获得对象C的LOCK,所以需要等待线程A执行完方法X并释放LOCK后,线程B才能执行方法X。2、在线程A调用对象C的同步方法X时,线程B可以随意调用对象C的非同步方法。3、在线程A调用对象C的同步方法X时,如果线程B调用对象C的同步方法Y,则先调用的同步方法先执行完并释放对象锁,线程B获得对象锁,才执行同步方法Y。

脏读一定会出现在操作实例变量的情况下,这就是不同线程争抢实例变量的结果。

可重入锁概念

对象A存在X、Y、Z三个同步方法,线程调用同步方法X,若在同步方法中调用同步方法Y,则Y可获得对象锁,同理在Y中调用方法Z,Z也可获得对象锁。
且如果在方法X中同时调用方法Y和方法Z,会按顺序执行Y和Z。

意义

防止死锁。

原理

在执行同步方法X时,该线程获得对象的同步锁。在未释放锁之前,其它无法获得该对象的同步锁,因此无法执行。而拥有该锁的线程,可以继续执行其方法。

Synchronized同步语句块

在之前的介绍中,多个线程调用一个同步方法时,是按顺序执行的。那么如果第一个线程执行方法耗时过长,那么第二个调用该方法的线程将等待过长的时间,这是不合理的。
但是单纯的使用代码块,效率是不会提升的,因为本质还是同步实现的。
实现方式:一半同步一半异步。
只用synchronized修饰需要同步的部分代码。

线程安全包含可见性和原子性两个方面。

可见性:一个线程对共享变量值的修改,能够及时的被其它线程看到。
原子性:即同步。该关键字修饰的方法要么不执行要么执行完,不存在执行一半的情况。

比较Synchronized和Volatile。

1- volatile是线程同步的轻量级实现,只能修饰变量。synchronized可修饰变量、方法和代码块。
2- volatile不会发生阻塞,synchronized会发生阻塞。
3- Synchronized同时具有可见性和原子性,Volatile只具有可见性
4- Synchronized关键字解决的是多个线程之间访问资源的同步性,Volatile关键字解决的是变量在多个线程之间的可见性。

synchronized实现可见性:

1- 获得互斥锁。
2- 清空工作内存。
3- 从主存拷贝数据到工作副本。
4- 代码操作。
5- 将修改后的数据写入主存。
6- 释放互斥锁。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值