1.一个类可以有多个对象,所以一个类可以有多个对象锁。
2.当一个类中有多个synchronized修饰的同步方法时,其中一个方法被线程访问持有锁,其他方法同样被锁住,其他线程依然不能访问其他同步方法,因为此时锁住的是该类的对象,相当于整个对象锁住了。
3.一个类只能有一个.claas,所有一个类只能有一个类锁。

首先的明白java中锁的机制

synchronized   在修饰代码块的时候需要一个reference对象作为锁的对象.   在修饰方法的时候默认是当前对象作为锁的对象.   在修饰类时候默认是当前类的Class对象作为锁的对象.

方法锁(synchronized修饰方法时)

通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。

synchronized 方法控制对类成员变量的访问:   每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突。

对象锁(synchronized修饰方法或代码块)

  当一个对象中有synchronized method或synchronized block的时候调用此对象的同步方法或进入其同步区域时,就必须先获得对象锁。如果此对象的对象锁已被其他调用者占用,则需要等待此锁被释放。(方法锁也是对象锁)             java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待;synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。这里也体现了用synchronized来加锁的1个好处,方法抛异常的时候,锁仍然可以由JVM来自动释放。 

对象锁的两种形式:

public class Test
{
// 对象锁:形式1(方法锁)
public synchronized void Method1()
{
System.out.println(“我是对象锁也是方法锁”);
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}

}// 对象锁:形式2(代码块形式)
public void Method2()
{synchronized (this){System.out.println("我是对象锁");try{Thread.sleep(500);} catch (InterruptedException e){e.printStackTrace();}}}

类锁(synchronized 修饰静态的方法或代码块)

  由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只有一份。所以,一旦一个静态的方法被申明为synchronized。此类所有的实例化对象在调用此方法,共用同一把锁,我们称之为类锁。        对象锁是用来控制实例方法之间的同步,类锁是用来控制静态方法(或静态变量互斥体)之间的同步。       类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的。    java类可能会有很多个对象,但是只有1个Class对象,也就是说类的不同实例之间共享该类的Class对象。Class对象其实也仅仅是1个java对象,只不过有点特殊而已。由于每个java对象都有1个互斥锁,而类的静态方法是需要Class对象。所以所谓的类锁,不过是Class对象的锁而已。获取类的Class对象有好几种,最简单的就是[类名.class]的方式。

public class Test
{
   // 类锁:形式1
public static synchronized void Method1()
{
System.out.println("我是类锁一号");
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}

}// 类锁:形式2
public void Method2()
{synchronized (Test.class){System.out.println("我是类锁二号");try{Thread.sleep(500);} catch (InterruptedException e){e.printStackTrace();}}}

文章来源于:类锁和对象锁的区别

java 对象锁和类锁的区别相关推荐

  1. Java锁Synchronized对象锁和类锁区别(搬运)

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...

  2. 透彻理解 Java synchronized 对象锁和类锁的区别

    synchronized 加到 static 方法前面是给class 加锁,即类锁:而synchronized 加到非静态方法前面是给对象上锁.这两者的区别我用代码来演示下: 对象锁和类锁是不同的锁, ...

  3. java锁方法和锁代码块_java的同步方法和同步代码块,对象锁,类锁区别

    /** * @author admin * @date 2018/1/12 9:48 * 做用在同一个实例对象上讨论 * synchronized同步方法的测试 * 两个线程,一个线程调用synchr ...

  4. java基础---对象锁和类锁的区别

    synchronized 加到 static 方法前面是给class 加锁,即类锁:而synchronized 加到非静态方法前面是给对象上锁. 对象锁和类锁是不同的锁,所以多个线程同时执行这2个不同 ...

  5. Java并发编程-八锁问题带你彻底理解对象锁和类锁

    八锁问题带你理解对象锁和类锁 8锁问题演示 1.标准访问 2.在邮件方法中暂停4秒,请问先打印邮件还是短信 3.新增普通sayHello方法,请问先打印邮件还是hello 4.两部手机,请问先打印邮件 ...

  6. java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

  7. synchronized 对象锁和类锁的区别

    synchronized 对象锁和类锁的区别 synchronized 描述 一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限, 在Java里边就是拿到某个同步对象的 ...

  8. JUC并发编程笔记1__JUC概述、虚假唤醒问题、JUC的生产者和消费者关系、8锁问题(对象锁、类锁区别)

    目录 一.回顾 概念 线程的几个状态 wait和sleep的区别 Synchronized 和 Lock的区别 二.虚假唤醒问题 举例synchronized下的生产者.消费者模式场景 三.JUC下的 ...

  9. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

  10. Java 对象锁和类锁全面解析

    2019独角兽企业重金招聘Python工程师标准>>> 最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念. ...

最新文章

  1. 为什么分数是循环小数
  2. python设计模式之享元模式
  3. 实验3-3 比较大小 (10 分)
  4. AES-128\192\256加密算法及其安全脆弱分析
  5. 下载Googleearth地图作为底图显示曝光点
  6. 重心法例题matlab,Excel重心法选址计算题的详细步骤
  7. layui 表格序号累加 翻页序号也累加
  8. 计算机组成原理中总线包括,计算机组成原理复习题
  9. 深度学习入门(五) softmax回归
  10. 【Unity3D】Unity5打不开VS2017,Unity打开VS2017异常,并且有时候最后打开的是Mono的解决方案
  11. 解析下载blob视频
  12. 函数feof使用注意事项
  13. LeetCode-179-最大数
  14. 国产M0核风机量产程序开发方案… FOC电机控制开发方案…3电阻采样
  15. git 禁止分支提交
  16. 九头蛇3389远程爆破
  17. java毕业设计开题报告SSM实现的在线音乐歌曲网站音乐播放器
  18. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第一场)
  19. 56. 数据增广 / 图像增广
  20. 《小说朗读器》采集功能升级

热门文章

  1. 如何查看Crontab任务是否执行
  2. Canvas填满浏览器窗口操作(九)
  3. C++ 判断一个数是不是素数
  4. java闰年判断原理_java 面试题闰年判断详解及实例
  5. 数据量太大怎么办?条形图/柱状图不够用?是时候让径向柱图出手了
  6. 解密最接近人脑的智能学习机器——深度学习及并行化实现,最全的Deep Learning解析
  7. 边缘检测--轮廓提取--透视变换实战
  8. 超详细,超易懂tcp的五层协议
  9. 洛谷P1049: 装箱问题
  10. 学习大数据的第19天——正则表达式、枚举类