五.synchronized锁

一.synchronized的作用与原理

  • synchronized关键词用来实现锁,由于其由JVM指令隐式实现也被称为隐式锁。JVM使用monitor(监视器锁)来实现同步(synchronized关键字),每一个对象都有一个monitor,一个monitor只能被一个线程拥有。
  • 任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。通过 synchronized保证只有同步代码块的部分可以重排序,排斥未取得锁的线程,保证顺序一致性。
image.png
  • 一个对象一个锁,多个线程多个多个锁
    • 每一个对象都有一个monitor(锁),一个monitor只能被一个线程拥有。如果每个线程创建同一个类不同对象,则存在不同对象锁,若操作同一个变量,并不存在互斥性,因为线程所持有的对象锁并不相同。对于非静态static修饰的方法或变量,是一个对象一把锁的。
    • 用static修改的方法或者变量,在该类的所有对象是具有相同的引用的,这样的话,无论实例化多少对象,调用的都是一个方法和变量。

二.synchronized的锁的类型

假设P1、P2是同一个类的不同对象,P1、P2就都可以调用它们。

  • 1.把synchronized当作函数修饰符:它锁定的是调用这个同步方法对象。比如P1调用函数,而对P2而言,P1这个锁与它毫不相干,是两个不同的锁。
  • 2.同步块:锁就是synchronized传入的对象
  • 3.将synchronized作用于static 函数:锁时当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

推荐阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 1,780评论 0 6
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 1,266评论 1 14
  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    莹镜春鸣阅读 4,143评论 3 87
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 1,814评论 1 18
  • 前几日由于收拾房间,电脑也没有在,简单用笔写了几日。用笔写有用笔写的好处,虽然质量不高,但无法修改,非常节省...
    过雨阅读 20评论 0 0