如果一个对象有多个方法加了 synchronized,那么该对象有几把锁?

答案是一把锁 ??

代码示例:

public class Test {

    public synchronized void method1(){
        // do something
    }

    public synchronized void method2(){
        // do something
    }

}

对象锁是在一个类的对象上加的的锁,只有一把,不管有几个方法进行了同步。

这些同步方法都共有一把锁,只要一个线程获得了这个对象锁,其他的线程就不能访问该对象的任何一个同步方法。

对象锁:

synchronized 修饰实体里的非静态变量,锁的是对象

synchronized 修饰代码块,锁的是对象

synchronized 修饰非静态方法,锁的是对象

使用对象锁的情况,只有使用同一对象的线程才会受锁的影响,多个对象调用同一方法也不会受影响。

类锁:

synchronized 修饰类中的静态变量

synchronized 修饰静态方法

synchronized 修饰类.class

类锁是所有线程共享的锁,所以同一时刻,只能有一个线程使用加了锁的方法或方法体,不管是不是同一个实例。

参考文章:

https://blog.csdn.net/qa275267067/article/details/79804713

https://www.cnblogs.com/fengzheng/p/12066239.html

本文由博客一文多发平台 OpenWrite 发布!
个人公众号《骇客与画家》,欢迎关注

原文地址:https://www.cnblogs.com/gaohanghang/p/12108789.html

时间: 2024-11-12 01:15:00

如果一个对象有多个方法加了 synchronized,那么该对象有几把锁?的相关文章

Java中主类中定义方法加static和不加static的区别

Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用,后者必须先实例化后用实例调用) 知识点:1.Getter and Setter 的应用 2.局部变量与成员变量(也可叫做全局变量) 3.Static关键字的用法 a.成员变量被static修饰后的所有类的共享属性 b.方法被static修饰之后,在本类内调用的类名省略问题;以及不用Static,即使在本类内也必须先实例化 4.This关键字的用法 this:是当前类的对象引用.简单的记,它就代表当前

使用ajax()方法加载服务器数据

使用ajax()方法加载服务器数据 使用ajax()方法是最底层.功能最强大的请求服务器数据的方法,它不仅可以获取服务器返回的数据,还能向服务器发送请求并传递数值,它的调用格式如下: jQuery.ajax([settings])或$.ajax([settings]) 其中参数settings为发送ajax请求时的配置对象,在该对象中,url表示服务器请求的路径,data为请求时传递的数据,dataType为服务器返回的数据类型,success为请求成功的执行的回调函数,type为发送数据请求的

python中使用hasattr(x,'call')来判断一个对象是否存在某个方法

class Person: def PrintName(self): print 'Is a Person' def PrintHello(self): print 'Hello, world' per = Person()per.PrintName()print hasattr(per,'PrintName')#True python中使用hasattr(x,'call')来判断一个对象是否存在某个方法

iOS 开发之 为UIButton添加类别方法加载网络图片

iOS 开发之 为UIButton添加类别方法加载网络图片 使用GCD线程队列实现 工程如下: UIButton+WebCache.h #import <UIKit/UIKit.h> // 为Button添加类别方法 @interface UIButton (WebCache) - (void)xr_setButtonImageWithUrl:(NSString *)urlStr; @end UIButton+WebCache.m #import "UIButton+WebCache

easyui中 combogrid控件的loadData方法加载本地数据

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title

使用Application.GetResourceStream方法加载资源时得到的总是null

我们可以预先把程序中用到的资源,如图片,音乐等放入项目中,打包进XAP文档,需要的时候从中调用.下面就说说具体实现方法. 第一步,把数据存进项目. 1.右键点击项目名称-添加-新建文件夹(英文版请自行翻译),这里文件夹名以image为例,把需要的图片拖进来,当然你也可以不建,直接把图片拖到项目项目录下, 2.选中刚刚拖进去的图片,看右下角的属性标签,如果没有,右键点图片,选属性.生成操作选Resource. 第二步,程序调用. System.IO.Stream src = Application

MVC通过JsonResult返回Json数据,然后在视图页面中通过@Html.Partial()方法加载分部视图

首先,新建一个MVC类型的Web项目: 然后在Model文件夹下定义一个Student实体: public class Student { public int ID { get; set; } public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } } 然后新建一个Student控制器: using JsonDataWithMVC.Models; using Sy

LoadMxFile方法加载MXD文档

LoadMxFile方法加载MXD文档: private void loadMxFile方法ToolStripMenuItem_Click(object sender, EventArgs e) { //加载数据前如果有数据则清空 try { OpenFileDialog pOpenFileDialog = new OpenFileDialog();//打开文件 pOpenFileDialog.CheckFileExists = true;//判断文件存在 pOpenFileDialog.Tit

sublime为方法加注释快捷键(常用快捷键总结)

如何在sublime内为方法加注释呢? 在方法前面输入/** 然后回车即可或者ctrl+shift+/回车然后+*再回车也行. 常用注释形式有: 单行注释    选中内容后  ctrl+/ 多行注释    选中内容后 ctrl+shift+/ 常用快捷键总结: ctrl+r 搜索方法 ctrl+p 搜索文件 ctrl+F搜索文字 ctrl+shift+C 原文地址:https://www.cnblogs.com/xiaogou/p/11655716.html