简单了解Java synchronized关键字同步
作者:shemlothae 发布时间:2022-07-25 10:38:05
synchronized
synchronized可以用来同步块,同步方法。同步块可以用来更精确地控制对象锁,控制锁的作用域。(锁的作用域就是从锁的获得到锁的释放的时间,而且可以选择获取哪个对象的锁)。但是在使用同步块机制时,过多的使用锁也会引发死锁问题,同时获取和释放也有代价。
而同步方法,它所拥有的就是该类的对象,换句话说,就是this对象,而且锁的作用域是整个方法,这可能导致锁的作用域太大,有可能导致死锁问题。同时也可能包括了不需要同步的代码块在内,也会降低程序的运行效率。
不管是同步方法还是同步块,我们都不应该在里面包含无限循环,不然有可能导致获得锁之后,无限循环下去,无法释放获得的锁资源,从而导致等待锁的线程无法获得,出现死锁问题。
同步方法
非静态同步方法
所有的非静态同步方法使用的都是同一把锁----实例对象本身,也就是说一个实例对象的非静态方法获得锁之后,此对象的其他非静态方法必须等待该方法释放锁之后才能获取锁,而这个类的其他对象可以被获取,其他对象的非静态方法使用的是不同的锁
静态同步方法
所有的静态同步方法使用的都是同一把锁---该类对象本身,这两把锁使用的是不同的对象,所以,类的非静态方法和静态方法之间不存在锁竞争。但是一个类的静态方法之间存在锁竞争,
同步块
锁是可以选择的,所以只有存在同一把锁的同步块才存在锁竞争,注意!同步块的锁是可以选择的,但不是可以任意选择的(使用一个引用对象的实例变量不是一个好的选择,因为同步块在执行过程中,可能会改变它的值,比如设置为null,而对一个null对象加锁会发生异常,并且对不同的对象加锁也违背了使用锁的初衷)
同步是基于对象而不是基于引用的,多个变量可以引用一个对象,变量也可以改变引用的对象,因此,我们要根据实例对象而不是引用来考虑!作为一个原则!永远不要对一个可能再同步块中改变其值的实例变量加锁!!!
来源:https://www.cnblogs.com/shemlo/p/11604143.html


猜你喜欢
- 一、项目简述(+需求文档+PPT)功能:卡管理,卡消费,卡充值,图书借阅,消费,记录,注销等等功能。二、项目运行环境配置:Jdk1.8 +
- 超链接即内容链接,通过给特定对象设置超链接,可实现载体与特定网页、文件、邮件、网络等的链接,点击链接载体可打开链接目标,在文档处理中是一种比
- 过滤器、 * 、 * 概念概念1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,可以动态生
- 前言我们书接上文,我们在了解LINQ下面有说到在本地查询IEnumerbale主要是用委托来作为传参,而解析型查询IQueryable则用E
- 说在前面大一软件工程在读,java萌新一只,第一次写博客,技术很菜勿喷。如有错误欢迎指出!这个小程序是给朋友的生日礼物,耗时半天,实际写起来
- 注解从java5开始加入这一特性,发展到现在已然是遍地开花,在很多框架中得到了广泛的使用,用来简化程序中的配置。那充满争议的类型注解究竟是什
- 1、判断实体对象是否为空2、判断对象所有属性是否为空3、特别注意,实体类中如果有基本数据类型,会影响判断package com.liuxd.
- 前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分。它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home
- 本文实例为大家分享了Android滑动组件悬浮固定在顶部效果的具体代码,供大家参考,具体内容如下要想实现的效果是如下:场景:有些时候是内容中
- 接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时
- 1、添加maven依赖<dependency>  
- 前言老规矩,还是从最简单粗暴的开始。那么多简单算简单?多粗暴算粗暴?我告诉你可以不写一句代码,你信吗?直接把一个文件往IIS服务器上一扔,就
- resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部Result
- 效果图片重写DataGridView的OnRowPostPaint方法或者直接在DataGridView的RowPostPaint事件里写,
- 本文实例为大家分享了UnityShader实现运动模糊的具体代码,供大家参考,具体内容如下原理:像素的当前帧的NDC坐标(x,y
- 前两天朋友问我,有没有使用过StackExchange.Redis,问我要个封装类,由于之前都是使用ServiceStack.Redis,由
- 本文实例为大家分享了SpringBoot Http远程调用的具体代码,供大家参考,具体内容如下一、在实现远程调用时可以使用feign与htt
- 记得之前写Web项目的时候配置文件的读取都是用Properties这个类完成的,当时为了项目的代码的统一也就没做什么改动。但事后一直在琢磨S
- 一、邮件协议MTA 和 MDA 这样的服务器软件通常是现成的,我们通常不会关心这些邮件服务器的内部是如何运行 的。更多的需求场景,是需要发送
- 本程序通过JFrame实时显示本机摄像头图像,并将图像存储到一个缓冲区,当用户用鼠标点击JFrame中任何区域时,显示抓取图像的简单动画,同