go 下面文件锁的处理
file 类型无法取消 gc 时文件关闭的 Finalizer
go 里创建一个 file 时,会默认设置一个 Finalizer,当这个 File 回收时触发,关闭文件 fd,防止 fd 泄露。
但是我们不能通过 runtime.SetFinalizer(file, nil) 取消 File fd 回收的逻辑。原因在于 File 创建的逻辑:
go 标准库里, runtime.SetFinalizer(f.file, (*file).close) 把 Finalizer 设置在私有对象 File.file 上了,外层用户如果仅仅在 File 上取消 Finalizer,当 GC 开始时,f.file 仍然会调用 close 进行处理。
又由于 f.file 是私有类型,外层用户是不能进行 runtime.SetFinalize
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python 命令行之旅:使用 argparse 实现 git 命令
Python 命令行之旅:使用 argparse 实现 git 命令前言在前面三篇介绍 argparse 的文章中,我们全面了解了 argparse 的能力,相信不少小伙伴们都已经摩拳擦掌,想要打造一个属于自己的命令行工具。 本文将以我们日常工作中最常见的 git 命令为例,讲解如何使用 argparse 库来实现一个真正可用的命令行程序。 本系列文章默认使用 Python 3 作为解释器进行讲解。若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~git 常用命令大家不妨回忆一下,平时最常使用 git 子命令都有哪些? 当你写好一段代码或增删一些文件后,会用如下命令查看文件状态: git status确认文件状态后,会用如下命令将的一个或多个文件(夹)添加到暂存区: git add [pathspec [pathspec ...]]然后使用如下命令提交信息: git commit -m "your commit message"最后使用如下命令将提交推送到远程仓库: git push我们将使用 argparse 和 gitpython 库来实现这 4 个子命令。 关于...
- 下一篇
ConcurrentHashMap比其他并发集合的安全效率要高一些?
前言 我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇博文讨论的问题——为什么它不需要加锁呢? ConcurrentHashMap的简介 我想有基础的朋友知道在jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的,而1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现。JDK1.8的实现降低锁的粒度,JDK1.7版本锁的粒度是基于Segment的,包含多个HashEntry,而JDK1.8锁的粒度就是HashEntry(首节点)JDK1.8版本的数据结构变得更加简单,使得操作也更加清晰流畅,因为已经使用synchronized来进行同步,所以不需要分段锁的概念,也就不需要Segment这种数据结构了,由于粒度的降低,实现的复杂度也增加了JDK1.8使用红黑树来优化链表,基于长度很长的链表的遍历是一个很漫长的过程,而红黑树的遍历效率是很快的,代替一定...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果