搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
知新_RL
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
09开博——不差钱,就缺朋友
2
经典问题-N皇后(回溯)C++实现_n皇后问题c++代码
3
深入理解机器学习——机器学习概览_深入机器学习
4
逻辑回归(Logistic Regression)详解
5
不了解Sora?看完这篇文章你就懂了_sora csdn
6
最新最全的校园跳蚤小程序,二手商城小程序,二手书城小程序,带五星评分功能,发布商品,模糊搜索,评论,校园论坛功能_微信开发校园跳蚤市场
7
YOLOv5/v7/v8改进实验(七)之使用timm更换YOLOv8模型主干网络Backbone篇_warning 鈿狅笍 no model scale passed. assuming scale=
8
OpenCV透视变换示例
9
如何开一个minecraft Java服务器_mcjava怎么开服
10
01.夜莺监控简介及安装
当前位置:
article
> 正文
实现单例模式时synchronized的必要性_单例模式静态工厂访问为什么要加synchronized
作者:知新_RL | 2024-02-28 04:23:13
赞
踩
单例模式静态工厂访问为什么要加synchronized
实现单例模式时synchronized的必要性
首先了解一下Singleton模式通常的两种表现形式:
第一种形式:
public class Singleton {
private Singleton(){}
// 注意这是private 只供内部调用
private static Singleton instance = new Singleton();
// 这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null ;
public static synchronized Singleton getInstance() {
// 这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
// 使用时生成实例,提高了效率!
if (instance == null ) instance= new Singleton();
return instance;
}
}
使用Singleton.getInstance()可以访问单态类。
上面第二中形式就是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。
注意到lazy initialization形式中的synchronized,这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。
那么为什么只有使用synchronized关键字才可以达到单态的目的呢?synchronized到底有什么含义呢?
synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。
1. synchronized 方法 :通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:
public synchronized void accessVal( int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,
方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。
这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),
从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。
在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,
由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。
当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,
但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。 2. synchronized 块 :
通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized (syncObject) { // 允许访问控制的代码 }
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。
由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
对synchronized(this)的一些理解
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。
结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用
声明:
本文内容由网友自发贡献,转载请注明出处:
【wpsshop】
推荐阅读
article
pyshark
使用
教程...
安装pip install
pyshark
使用
例如:分析现有的pcap文件:import
pyshark
pcap = p...
赞
踩
article
TutorABC
董海冰
:
Golang
+
WebRTC
搭建
实时
音视频
云实践...
在 2019年第五届 Gopher China 大会上,
TutorABC
研发总监
董海冰
进行了题为《 用
Golang
搭建实...
赞
踩
article
[
HTML5
]
Blob
对象_
html
blob
...
写在前面本篇主要总结
Blob
对象属性及作用,通过DEMO介绍
Blob
对象的应用场景。
Blob
对象一直以来,JS都没有比较...
赞
踩
article
key
-
value
键值型
数据库
:
Redis
...
key
-
value
键值型
数据库
:
Redis
redis
Redis
是in-memory型(内存型)的键值
数据库
,数据在磁盘上...
赞
踩
article
Centos7
利用
pyshark
解析
QUIC
报文_scapy解析
quic
...
一:环境准备利用
pyshark
解析报文,如果是http,https等常见的协议,正常的版本一般也能搞定,但是如果解析比较...
赞
踩
article
【
C++
入门到精通】智能指针
shared
_
ptr
循环
引用
|
weak
_
ptr
简介及
C++
模拟实...
这篇文章介绍了std::
shared
_
ptr
循环
引用
问题以及解决方案std::
weak
_
ptr
。它解释了
循环
引用
的概念,...
赞
踩
article
Android中
ScrollView
嵌套
ListView
_
android
scrollview
嵌套
l...
参考网址:https://blog.csdn.net/wanghao200906/article/details/510...
赞
踩
article
如何在
VSCode
中带有参数的Debug(
name
、
program
、$
file
、
args
、pickA...
关键字:
name
、
program
、$
file
、
args
、
pickArgs
、指定虚拟环境如何在
VSCode
中带有参数的De...
赞
踩
article
23
种
设计模式
总结_
23
种
设计模式
哪个最
常用
...
23
种
设计模式
总结_
23
种
设计模式
哪个最
常用
23
种
设计模式
哪个最
常用
设计模式
思路点: 1、...
赞
踩
article
Mac
命令行
安装
dmg
文件...
1.安装
dmg
文件 hdiutil attach jdk-9.0.1_osx-x64_bin.
dmg
会挂载在 ...
赞
踩
article
scapy
解析
pcap
数据包
笔记_
scapy
解析
pcap
...
scapy
解析
pcap
数据包
笔记1from
scapy
.all import * def analyzePcap(fi...
赞
踩
article
连接
状态
_
TCP
连接
管理之(
TCP
状态
转换图、
TIME
_
WAIT
状态
、静默时间、
FIN
_
WAIT
_2...
一、
TCP
状态
转换图
TCP
/IP协议栈深度解析丨实现单机百万
连接
丨优化三次握手、四次挥手丨优化
TCP
的传输速率丨epol...
赞
踩
article
Python
SNMP
获取交换机ARP表和FDB表(MAC和端口对应表)_
mac
vlan
端口 ...
import sysimport py
snmp
.hlapi as hlapiimport py
snmp
.proto.rf...
赞
踩
article
Spring
源码
之
整合
Mybatis
底层实现_
sqlsession
.
flushstatements
(...
目录1.
Spring
整合
Mybatis
底层
源码
2.SqlSessionTemplate类的作用3.
Mybatis
一级...
赞
踩
article
【
Redis
】(一)一文读懂
Redis
基本
数据类型
及其
常见
应用
场景
与底层
实现
原理_
redis
应用
场景
...
文章目录前言一、String(字符串)1.1 String常用命令1.2 String主要
应用
场景
1.3 String底...
赞
踩
article
Socket
TCP/IP
协议
数据传输过程中的
粘包
和
分包
问题_
tcp
分包
...
3.读取缓存的数据是不定长的,所以我们把读取到的数据添加到我们自己的一个byte[]数组中,然后根据我们的业务逻辑来找到...
赞
踩
article
docker
版
zerotier
-
planet
服务端
搭建_
zerotier
planet
...
ZeroTier这一类 P2P VPN 是在互联网的基础上将自己的所有设备组成一个私有的网络,可以理解为互联网连接的局域...
赞
踩
article
java
单例
调用_
java
单例
模式...
单例
模式就是始终是一个对象实例.它对外不提供构造函数,因此我们不能够同时产生多个对象.(常用语工具类,数据库连接类等等)...
赞
踩
article
面经 -
OpenStack
(
Docker
、
Django
、K8S、
SDN
)知识点_
django
和do...
概述云计算是一种采用按量付费的模式,基于虚拟化技术,将相应计算资源(如网络、存储等)池化后,提供便捷的、高可用的、高扩展...
赞
踩
article
Android
免
so
逆向
框架
unidbg
入门及浅析
_
unidbg
原理
...
本文来自互联网,我只是收集整理,
unidbg
作者写这个东西不容易,有条件的小伙伴可以去支持一下
unidbg
是一个允许你用...
赞
踩
相关标签
tcp/ip
网络协议
网络
数据库
java
shell
pyshark
tshark
QUIC
Centos7
c++
开发语言
Android
ScrollView嵌套
嵌套ListView
滑动
焦点分发
vscode
ide
编辑器
设计模式
操作系统
连接状态