synchronized是怎样实现可见性,有序性,可重入性的?

简介: synchronized可见性,有序性,可重入性的

可见性:

  • 线程加锁前,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值。
  • 线程加锁后,其它线程无法获取主内存中的共享变量。
  • 线程解锁前,必须把共享变量的最新值刷新到主内存中。

有序性:

  • synchronized同步的代码块,具有排他性,一次只能被一个线程拥有,所以synchronized保证同一时刻,代码是单线程执行的。
  • 因为as-if-serial语义的存在,单线程的程序能保证最终结果是有序的,但是不保证不会指令重排。
  • 所以synchronized保证的有序是执行结果的有序性,而不是防止指令重排的有序性。

可重入性:

  • synchronized 是可重入锁,也就是说,允许一个线程二次请求自己持有对象锁的临界资源,这种情况称为可重入锁。
  • synchronized 锁对象的时候有个计数器,他会记录下线程获取锁的次数,在执行完对应的代码块之后,计数器就会-1,直到计数器清零,就释放锁了。
  • 之所以,是可重入的。是因为 synchronized 锁对象有个计数器,会随着线程获取锁后 +1 计数,当线程执行完毕后 -1,直到清零释放锁。
相关文章
|
4天前
|
缓存 安全 Java
多线程的三大特性:原子性、可见性和有序性
多线程的三大特性:原子性、可见性和有序性
24 0
|
4天前
|
存储 安全 Java
关于volatile解决内存可见性问题(保证线程安全)
关于volatile解决内存可见性问题(保证线程安全)
|
4天前
|
缓存 Java
13.synchronized总结:怎么保证可见性、有序性、原子性?
13.synchronized总结:怎么保证可见性、有序性、原子性?
43 0
13.synchronized总结:怎么保证可见性、有序性、原子性?
|
4天前
|
缓存 安全 Java
3.线程安全之可见性、有序性、原子性是什么?
3.线程安全之可见性、有序性、原子性是什么?
44 0
3.线程安全之可见性、有序性、原子性是什么?
|
4天前
|
缓存 安全 Java
5.volatile是什么?怎么保证可见性?
5.volatile是什么?怎么保证可见性?
44 0
5.volatile是什么?怎么保证可见性?
|
10月前
|
存储 缓存 安全
JUC之可见性和有序性
JUC之可见性和有序性
|
12月前
|
缓存 Java 编译器
并发编程-06线程安全性之可见性 (synchronized + volatile)
并发编程-06线程安全性之可见性 (synchronized + volatile)
68 0
|
缓存 Java
Java并发中的可见性和原子性
Java并发中的可见性和原子性
Java并发中的可见性和原子性
|
Java 编译器
【多线程:volatile】可见性
【多线程:volatile】可见性
120 0
【多线程:volatile】有序性
【多线程:volatile】有序性
118 0