synchronized的初步理解

在这里插入图片描述
1.两个线程同时访问一个对象的同步方法
需要等待线程结束
2.两个线程访问的是两个对象的同步方法
同时并行执行的
3.两个线程访问的是synchronized的静态方法
共用一把锁 会一个个的执行

在这里插入图片描述
4.同时访问同步方法和非同步方法
同时并行执行
Synchronized所修饰的方法才被作用 其他未被修饰的不受影响

5.访问同一个对象的不同的普通同步方法
串行 实际上拿到的是同一个this的锁

6.同时访问静态同步和非静态同步方法
Static修饰的同步方法是类锁.class
同步方法则是this(对象锁) 锁对象不同
并行

7.方法抛异常后,会释放锁
一旦抛出了异常,第二个线程会立刻进入同步方法,意味着锁已经释放
RuntimeException();

  •  *Synchronized的性质**
    

①可重入
指的是同一线程的外层函数获取锁以后,内层函数可以直接再次获取该锁
好处:避免死锁,提升封装性
粒度(范围):
1.同一个方法是可重入的
2.可重入不要求是同一个方法
3.证明可重入不要求是同一个类中的
②不可中断

      **可见性原理**:JAVA内存模型

Java内存模型是围绕着并发编程中原子性、可见性、有序性这三个特征来建立的。
原子性(Atomicity):一个操作不能被打断,要么全部执行完毕,要么不执行。在这点上有点类似于事务操作,要么全部执行成功,要么回退到执行该操作之前的状态。
可见性:一个线程对共享变量做了修改之后,其他的线程立即能够看到(感知到)该变量这种修改(变化)。
有序性:对于一个线程的代码而言,我们总是以为代码的执行是从前往后的,依次执行的。这么说不能说完全不对,在单线程程序里,确实会这样执行;但是在多线程并发时,程序的执行就有可能出现乱序。用一句话可以总结为:在本线程内观察,操作都是有序的;如果在一个线程中观察另外一个线程,所有的操作都是无序的。前半句是指“线程内表现为串行语义(WithIn Thread As-if-Serial Semantics)”,后半句是指“指令重排”现象和“工作内存和主内存同步延迟”现象。
Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存(可以与前面将的处理器的高速缓存类比),线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成,线程、主内存和工作内存的交互关系如下图所示
在这里插入图片描述

  ****sychronized的缺陷***

在这里插入图片描述

 **Lock的几个用法**

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值