一  什么是对象锁

对象锁也叫方法锁,是针对一个对象实例的,它只在该对象的某个内存位置声明一个标识该对象是否拥有锁,所有它只会锁住当前的对象,而并不会对其他对象实例的锁产生任何影响,不同对象访问同一个被synchronized修饰的方法的时候不会阻塞,

例如:

public class MyObject {

private synchronized void method1(){

try {

System.out.println(Thread.currentThread().getName());

Thread.sleep(4000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//synchronized修饰为同步方法,如果先调用method1,则4秒后才会调用method2

//如果不用synchronized修饰,则可以直接异步调用,没有影响

private void method2(){

System.out.println(Thread.currentThread().getName());

}

}

创建一个类,synchronized修饰普通方法,即为对象锁,那么这个时候,多个线程访问同一个对象实例的这个方法时,是会同步的,并且只有一个线程执行完,另一个线程才会执行:

public static void main(String[] args) {

//创建一个对象

MyObject myObject=new MyObject();

Thread t1=new Thread (new Runnable() {

@Override

public void run() {

myObject.method1();

}

},"t1");

Thread t2=new Thread (new Runnable() {

@Override

public void run() {

myObject.method1();

}

},"t2");

t1.start();

t2.start();

}

即,打印t14秒之后,t2才会打印,因为两个线程调用的是同一个对象实例的方法,即同一把锁,所有会同步执行

而如果是不同对象实例的话,则没有影响,因为两个线程调用的是不同实例的锁方法,即不是同一把锁,没有关系,所以会正常输出,不会同步

public static void main(String[] args) {

//创建两个对象

MyObject myObject=new MyObject();

MyObject myObject01=new MyObject();

Thread t1=new Thread (new Runnable() {

@Override

public void run() {

myObject.method1();

}

},"t1");

Thread t2=new Thread (new Runnable() {

@Override

public void run() {

myObject01.method1();

}

},"t2");

t1.start();

t2.start();

}

二 对象锁的几种形式以及应用案例

1 synchronized修饰普通方法属于对象锁,

2,

synchronized修饰的代码块传入this也属于对象锁

应用:减小锁粒度,第二种形式就比较好,比如A线程调用一个同步方法需要很长时间,那么B就要等待很长时间,这个时候可以将必须同步的代码使用synchronized代码块,

不不需要同步的先执行,节约资源

三 类锁

类锁是锁住整个类,当有多个线程来声明这个类的对象时候将会被阻塞,直到拥有这个类锁的对象呗销毁或者主动释放了类锁,这个时候在被阻塞的线程被挑选出一个占有该类锁,声明该类的对象。其他线程继续被阻塞住

(上面百度的),即一句话,不管多少个对象,多少个对象,共用一把多,且只有一把,不管怎么调用,都会同步

上面方法加static变类锁:

private static synchronized void method1(){

try {

System.out.println(Thread.currentThread().getName());

Thread.sleep(4000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

这个时候无论线程调用的是多少个对象实例的方法,都会同步

四 类锁形式

1 synchronized修饰静态方法属于类锁

2

java 对象锁_个人对java中对象锁与类锁的一些理解与实例相关推荐

  1. mysql update 排他锁_数据库:Mysql中“select ... for update”排他锁分析

    Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...

  2. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  3. java 自旋锁_搞懂Java中的自旋锁

    轻松搞懂Java中的自旋锁 前言 在之前的文章<一文彻底搞懂面试中常问的各种"锁">中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学 ...

  4. java jsonnode 创建_如何在Java中访问JsonNode的JSON字段,数组和嵌套对象?

    一个JsonNode是杰克逊的树模型为JSON,它可以读取JSON成JsonNode实例,写一个JsonNode出来JSON.通过创建ObjectMapper实例并调用readValue()方法,使用 ...

  5. java对象头_浅谈java对象结构 对象头 Markword

    概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ----- ...

  6. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  7. java 同步锁_死磕 java同步系列之自己动手写一个锁Lock

    问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...

  8. java 线程由浅入深_由浅入深,Java 并发编程中的 Synchronized(一)

    synchronized 作用 synchronized 关键字是 Java 并发编程中线程同步的常用手段之一. 1.1 作用: 确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须 ...

  9. java 多线程同步_详解Java多线程编程中的线程同步方法

    1.多线程的同步: 1.1.同步机制:在多线程中,可能有多个线程试图访问一个有限的资源,必须预防这种情况的发生.所以引入了同步机制:在线程使用一个资源时为其加锁,这样其他的线程便不能访问那个资源了,直 ...

最新文章

  1. cmd开无线服务器,使用cmd命令开启wifi
  2. iOS开发之Masonry框架源码解析
  3. 我的世界minecraft-Python3.9编程(3)-创建一根柱子
  4. 如何启用和关闭数据库的Oracle归档模式
  5. 在 Xunit 中使用依赖注入
  6. 【ArcGIS遇上Python】Python实现Modis NDVI批量化月最大合成
  7. 设置DVWA出现Could not connect to the MySQL service. Please check the config的解决方法,默认登录账号
  8. ygo游戏王卡组_ACG大科普(7)游戏王
  9. word2016开机后首次打开非常慢_5款iPhone实测 iOS 13.4.1运行速度:升级后表现更糟糕?...
  10. 使用AsyncDisplayKit提升UICollectionView和UITableView的滚动性能
  11. 一、Spark安装与部署
  12. Photoshop更换证件照底色
  13. 不用计算机做客户画像,描绘客户画像(有电脑的同学可做,完成加平时分2分)...
  14. PHPwind9.01傻瓜图解安装教程
  15. 计算机网络基础技术:数据通信技术基本概念
  16. 关掉MyEclipse checking for updates(检查更新)
  17. FICO配置详解之四:成本中心会计
  18. speedoffice(Excel)如何插入子表?
  19. C++020-C++因数,公因数,公倍数
  20. [bugku]解密系列+杂项

热门文章

  1. android 监控sim卡,android监控sim卡有没有服务示例(sim卡管理)
  2. 如何写好一份PPT?
  3. 腾讯大数据之 TDW 计算引擎解析——Shuffle
  4. STM32H743 TFTP Boot 简录
  5. SD卡数据丢失恢复软件免费下载
  6. 序列包含一个以上的元素_小疯谈python:(五)数据类型之序列类型(中)
  7. 无轨送餐机器人_送餐机器人原理
  8. 数据库sql语句查询条数
  9. php f4v元数据,[AS3]视频播放器处理flv,mp4,f4v元数据的问题
  10. 前端学习之表格、简历制作及登录表单