Go语言中文网 为您找到相关结果 1515

Go语言实战笔记(七)| Go 类型

《Go语言实战》读书笔记,未完待续,欢迎扫码关注公众号flysnow_org,第一时间看后续笔记。 Go 语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么。 提前知道值的类型的好处有很多,比如编译器可以合理的使用这些值,可以进一步优化代码,提高执行的效率,减少bug等等。 基本类型基本类型是Go语言自带的类型,比如数值类型、浮点类型、字符类型以及布尔类型,他们本质上是原始类型,也就是不可改变的,所以对他们进行操作,一般都会返回一个新创建的值,所以把这些值传递给函数时,其实传递的是一个值的副本。 12345678910func main() { name:="张三" fmt.Println(m...阅读全文

博文 2017-07-04 02:20:51 飞雪无情

单例模式

Golang 单例模式的几种形式 1.非线程安全,虽然说是单例模式,但是如果实例正在创建中,此时多个线程同时访问,就会获得多个结果 package main var instance *Singleton type Singleton struct { } func Instance() *Singleton{ if instance == nil { instance = &Singleton{} } return instance } 加锁单例模式 package main import "sync" var ( instance *Singleton mu sync.Mutex ) type Singleton struct { } func Instance() *Singleton...阅读全文

博文 2019-06-22 02:32:38 布衣码农

OS Thread Model

概念 线程: 程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,线程由CPU独立调度,在多CPU下可以多线程同时运行。 进程: 进程是资源(CPU、内存等)分配的基本单位,拥有独立的地址空间,它是程序执行时的一个实例,一个进程可有多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。 操作系统线程模型 1:1核心线程模型 pthread线程库--NPTL image.png 内核线程(KLT)由操作系统内核直接支持的线程,内核通过操纵调度器对线程进行调用,程序不直接与内核线程接触而是通过轻量级进程(LWP),LWP内核线程一一对应,程序和内核线程通过轻量级进程联系起,这样的局限性就是每次线程操作都需要从用户态到内核态的转化,代价高,而且由于一一对应的...阅读全文

博文 2019-10-11 01:32:45 aside section ._1OhGeD

go语句及其执行规则

参考:https://time.geekbang.org/column/article/39841?utm_source=weibo&utm_medium=xuxiaoping&utm_campaign=promotion&utm_content=columns 不要通过共享数据来通讯,恰恰相反,要以通讯的方式共享数据。 Don’t communicate by sharing memory; share memory by communicating. 一个进程至少会包含一个线程。如果一个进程只包含了一个线程,那么它里面的所有代码都只会被串行地执行。每个进程的第一个线程都会随着该进程的启动而被创建,它们可以被称为其所属进程的主线程。 相对应的,如果一个进程中包含了多个线程,那么其中的代码就...阅读全文

博文 2020-01-13 00:33:14 1350368559

Go并发编程-并发编程难在哪里

一、前言 编写正确的程序本身就不容易,编写正确的并发程序更是难中之难,那么并发编程究竟难道哪里那?本节我们就来一探究竟。 二、数据竞争 https://yourbasic.org/golang/data-races-explained/ 当两个或者多个线程(goroutine)在没有任何同步措施的情况下同时读写同一个共享资源时候,这多个线程(goroutine)就处于数据竞争状态,数据竞争会导致程序的运行结果超出写代码的人的期望。下面我们来看个例子: package main import ( "fmt" ) var a int //goroutine1 func main() { //1,gouroutine2 go func(){ a = 1//1.1 }() //2 if 0 == a...阅读全文

博文 2020-02-01 19:32:46 阿里加多

Go调度器介绍和容易忽视的问题

本文记录了本人对Golang调度器的理解和跟踪调度器的方法,特别是一个容易忽略的goroutine执行顺序问题,看了很多篇Golang调度器的文章都没提到这个点,分享出来一起学习,欢迎交流指正。 什么是调度器 为了方便刚接触操作系统和高级语言的同学,先用大白话介绍下什么是调度器。 调度,是将多个程序合理的安排到有限的CPU上来使得每个程序都能够得以执行,实现宏观的并发执行。比如我们的电脑CPU只有四核甚至双核,可是我们却可以在电脑上同时运行几十个程序,这就是操作系统调度器的功劳。但操作系统调度的是进程和线程,线程简单地说就是轻量级的进程,但是每个线程仍需要MB级别的内存,而且如果两个切换的线程在不同的进程中,还需要进程切换,会使CPU在调度这件事上花费大量时间。 为了更合理的利用CPU,Go...阅读全文

博文 2019-08-18 00:04:26 CodeWithTxT

【每日笔记】【Go学习笔记】2018-12-28 go语法笔记与MPG

李乐 1.数组与切片 1.1数组 和以往认知的数组有很大不同。 数组是值类型,赋值和传参会复制整个数组;数组长度必须是常量,且是类型的组成部分。[2]int 和 [3]int 是不同类型;指针数组 [n]T(数组每个元素都是指针),数组指针 [n]T(指向数组的指针);内置函数 len 和 cap 都返回数组⻓长度 (元素数量)。 a := [3]int{1, 2} // 未初始化元素值为 0。 b := [...]int{1, 2, 3, 4} // 通过初始化值确定数组⻓长度。 d := [...]struct { name string age uint8 }{ {"user1", 10}, {"user2", 20}, // 别忘了最后一⾏的逗号。 } println(len(a),...阅读全文

博文 2018-12-30 10:34:44 LNMPR源码研究

以太坊源码分析—挖矿与共识

前言 挖矿(mine)是指矿工节点互相竞争生成新区块以写入整个区块链获得奖励的过程.共识(consensus)是指区块链各个节点对下一个区块的内容形成一致的过程在以太坊中, miner包向外提供挖矿功能,consensus包对外提供共识引擎接口 挖矿 miner包主要由miner.go worker.go agent.go 三个文件组成 Miner 负责与外部交互和高层次的挖矿控制 worker 负责低层次的挖矿控制 管理下属所有Agent Agent 负责实际的挖矿计算工作 三者之间的顶层联系如下图所示 下面先从这几个数据结构的定义和创建函数来了解下它们之间的联系 Miner Miner的定义如下 type Miner struct{ mux *event.TypeMux worker *...阅读全文

博文 2018-11-13 19:34:38 187J3X1

Zz的Go语言学习--并发之道:并发问题基础

## **前言** 我毕业已经块10个月了,现在在一家区块链公司就职。我们主要做技术,开发公链,使用Go语言,因此就一直在学习Go语言相关知识。我觉得我可能和大多数开发者一样:以几本基础的书入门,学习下基本语法(好在Go语言是我觉得语法最简单的语言)然后再学习下channel怎么回事,goroutine怎么回事,基本上就开始上手了。从项目中也学习到了一些知识点,也踩了不少的坑。 但是我越来越发现,当你一直在做一件事的时候,那你的技术和认知也就停留在这上面了。这就导致了你写的代码永远是一个样子,用的方法也永远是一个样子,很多程序员死就是死在了这点上。当然,我自己也认识到了这一点,所以,今天开始得花点额外时间学习了。 《Go语言并发之道》这本书我从入职后就买了,一直拿他当工具书,也没有系统地看过...阅读全文

博文 2019-10-08 21:38:06 zzdior

Go 开发关键技术指南 | Go 面向失败编程 (内含超全知识大图)

作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图! 导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 2 篇。 Could Not Recover 在 C/C++ 中, 最苦恼的莫过于上线后发现有野指针或内存越界,导致不可能崩溃的地方崩溃; 最无语的是因为很早写的日志打印,比如 %s 把整数当字符串,突然某天执行到了崩溃; 最无奈的是无论因为什么崩溃都导致服务的所有用户受到影响。 如果能有一种方案,将指针和内存都管理起来,避免用户错误访问和释放,这样虽然浪...阅读全文

博文 2019-12-26 11:32:41 阿里巴巴云原生

进程线程协程的介绍

进程(process): 定义 狭义定义:进程就是一段程序的执行过程例如启动的某个app。 广义定义:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程即是基本的分配单元,也是基本的执行单元。 特征 每个进程都有自己的地址空间,一般情况下,包含文本区域、数据区域、堆栈 进程是执行中的程序,程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称之为进程 进程本身不会运行,是线程的容器。线程不能单独执行,必须组成进程 一个程序至少有一个进程,一个进程至少有一个线程 对于操作系统来讲,一个任务就是一个进程,比如开一个浏览器就是启动一个浏览器进程。打开一款app就是打开一个进程,例如打开香哈就是运行了一个...阅读全文

博文 2019-05-18 16:34:37 猫祭司

用 GODEBUG 看调度跟踪

让 Go 更强大的原因之一莫过于它的 GODEBUG 工具,GODEBUG 的设置可以让 Go 程序在运行时输出调试信息,可以根据你的要求很直观的看到你想要的调度器或垃圾回收等详细信息,并且还不需要加装其它的插件,非常方便,今天我们将先讲解 GODEBUG 的调度器相关内容,希望对你有所帮助。 不过在开始前,没接触过的小伙伴得先补补如下前置知识,便于更好的了解调试器输出的信息内容。 原文地址:用 GODEBUG 看调度跟踪 前置知识 Go scheduler 的主要功能是针对在处理器上运行的 OS 线程分发可运行的 Goroutine,而我们一提到调度器,就离不开三个经常被提到的缩写,分别是: G:Goroutine,实际上我们每次调用 go func 就是生成了一个 G。 P:处理器,一般...阅读全文

博文 2019-08-19 20:02:39 煎鱼

【Go语言踩坑系列(九)】Channel(上)

声明 本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。 我们知道,Go实现了两种并发形式,第一种是多线程共享内存,其实就是Java,C++等语言的多线程并发,通过锁来进行访问。另一种则是Go特有的CSP(communicating sequential processes)并发模型。 什么是CSP? CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,由 Tony Hoare 于 1977 年提出。它是在串行时代提出的一个概念,慢慢的演化成了现在的一种并发模型。简单来说,CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消...阅读全文

博文 2020-04-12 18:32:41 NoSay

4. Go 性能调优之 —— 跟踪

文链接:https://github.com/sxs2473/go...本文使用 Creative Commons Attribution-ShareAlike 4.0 International 协议进行授权许可。 Tracing Go programs 在 Go 1.5 中,添加了一个新的工具:执行跟踪器。在本章中,我们将了解跟踪器的作用以及它如何帮助我们在程序中指出性能问题。 与pprof不同的是,正如我们在检查 Go 程序当前执行的内容之前看到的,执行跟踪器使 Go 运行时在每次事件发生时主动报告。这些事件可以是 goroutine 的创建、系统调用、堆大小的更改等等。每次发生这些事件中的一个时,都会报告其时间戳和大多数事件的堆栈跟踪。 在启用Go执行跟踪器的情况下执行程序的结果是一...阅读全文

博文 2018-09-11 16:35:05 sxssxs

不使用context库, 自己实现控制goroutine退出

* 首先context库的用法 ```go // context 库 func main(){ ctx, cancelFunc := context.WithCancel(context.Background()) go func(ctx context.Context){ var i int for { select { case <-ctx.Done(): fmt.Println("cancel") return default: } i++ fmt.Println(i) select { case <-ctx.Done(): fmt.Println("cancel") return default: } i-- fmt.Println(i) } }(ctx) time.Sleep(ti...阅读全文

博文 2020-06-03 17:18:11 loop_0

go语言学习

1、go的产生 go语言是谷歌公司开发的第二款语言,谷歌工程师感觉使用过去的开发语言在进行软件开发时,效率低,感觉痛苦,所以就开发了此语言 go语言是为了专门针对多处理器系统应用程序的编程而产生的,性能可以和c/c++媲美,开发效率跟高,使得多处理器系统的编程更加容易,快捷。使用go语言在进行多核处理器软件开发时,go语言对其进行了优化。具有编译快,效率高,性能好等优点。 2、go语言学习简介 在学习go语言时,我们可以选用intellij idea工具来使用go语言编程,此工具安装插件就可以把go语言的语法进行高亮显示 在学习go语言的过程中,go语言给我的第一感觉就是:简介,编程感觉很爽,在我看来,一门编程语言首先它是一门语言,语言追求的就是简洁,就像学习一门语言一样只要能吧一个问题说明...阅读全文

博文 2018-03-24 12:32:33 harry1986601

Tidb + 分布式锁实现幂等--golang实现奖品发放系统

问题背景 最近业务上遇到这样的场景,觉得很有代表性,所以拿来说一说。我们有一个奖品发放系统,当用户申请奖品的时候,首先需要判断用户有没有申请过奖品,如果没有申请过,则去奖品总量扣除一个,然后再把用户申请记录写回数据库。 流程如下: 时序 事件 t1 检测用户申请过奖品 t2 奖品扣除 t3 插入用户申请记录 t4 返回申请成功 如果是正常的但线程执行完全没有问题,但是我们是并发的。所以很有可能会有好多事件都到t2导致多次申请,或者奖品多次扣除等情况。 解决方案 方案1:事务 最开始想到的就是数据库的事务了,在t1开始前启动事务,t1查询使用for update加锁,其他事务继续执行相同条件的for update的时候则会block,直到上个事务执行完成。这种方案很完美,但是只限于InnoDB...阅读全文

博文 2019-07-07 15:32:42 lucasgao

2017双11技术揭秘—分布式缓存服务Tair的热点数据散列机制

摘要: Tair是阿里巴巴集团自研的弹性缓存/存储平台,在内部有着大量的部署和使用。Tair的核心组件是一个高性能、可扩展、高可靠的NoSQL存储系统。目前支持MDB、LDB、RDB等存储引擎。本文基于Tair的存储和访问原理,对缓存的读写热点问题进行讨论,并给出一个满足现阶段需求的热点数据读写问题的解决方案。 作者:刘欢(浅奕) ![图片描述](http://img.blog.csdn.net/20171229113421675?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity...阅读全文

C++服务端面试准备(4)Linux及多线程相关

声明:本文内容纯属博主自己查找和归纳的个人所需的知识点,仅作参考,如有错误,博主强烈希望您指出。如果您是某个知识点的原创博主,如有需要,可联系本人加上链接。本文内容会根据博主所需进行更新,希望大家多多关照。 文件IO相关知识点 七种文件类型:普通文件(-)、目录(d)、符号链接(l)、管道(p)、套接字(s)、字符设备(c)、块设备(b) shell中文件的颜色:白色——普通文件、绿色——可执行文件、红色——压缩文件、蓝色——目录、青色——链接文件、黄色——块设备字符设备管道、灰色——其他文件 PCB:进程控制块,存放文件描述符表,本质是一个结构体 PCB内部成员:进程ID、进程状态、当前工作目录、文件描述符表、用户ID组ID、信号相关的信息等 一个进程有一个文件描述符表,大小为1024字节...阅读全文

博文 2020-04-09 00:32:42 DX3906

P的状态转换

声明 下面的分析均基于Golang1.14版本。 状态图 P状态图 主要流程 1.procresize创建,Go程序初始化时初始CPU数量个P。 2.acquirep进入运行状态。当有新的G创建或waiting状态的G变得可运行,并且有P空闲时,通过acquirep获取p来运行最新的G。 3.entersyscall,进入系统调用状态。当P绑定的M正在运行的G进入系统调用状态,P也随之进入系统调用状态。 4.exitsyscallfast,退出系统调用状态。如果G快速退出系统调用,此时P理应等待G,当G退出系统调用时,继续运行G的代码。 5.retake,如果G长时间处于系统调用,此时P应与对应的G,M解绑。考虑到如果所有G都阻塞在系统调用,则整个Go程序都阻塞在系统调用,无法执行用户代码,...阅读全文

博文 2020-05-16 15:32:44 不争_900c

Golang学习笔记-Goroutines

并发 首先 go 是一个实现并发的语言,并非并行 并发 vs 并行 并行是在同一时间内,可以同时执行多个任务;并发则是在一个时间片内只能执行单一任务,并把一段时间切分为多个时间片,不同时间片执行不同任务,在宏观上看像是在一段时间内同时执行了多个任务。如下图: currency 并行不会总是导致更快的执行时间。这是因为并行运行的组件可能必须相互通信。在组件在多个内核中并行运行的情况下,此通信开销很高。因此,并行程序并不总是能够缩短执行时间 在golang 中使用 goroutines 和 channel 实现并发。 什么是 Goroutines Goroutine是与其他函数或方法同时运行的函数或方法。可以认为它是轻量级的线程。与线程相比,创建Goroutine的成本很小。因此,Go应用程序具...阅读全文

Golang源码学习:调度逻辑(四)系统调用

Linux系统调用 概念:系统调用为用户态进程提供了硬件的抽象接口。并且是用户空间访问内核的唯一手段,除异常和陷入外,它们是内核唯一的合法入口。保证系统的安全和稳定。 调用号:在Linux中,每个系统调用被赋予一个独一无二的系统调用号。当用户空间的进程执行一个系统调用时,会使用调用号指明系统调用。 syscall指令:因为用户代码特权级较低,无权访问需要最高特权级才能访问的内核地址空间的代码和数据。所以需要特殊指令,在golang中是syscall。 参数设置 x86-64中通过syscall指令执行系统调用的参数设置 rax存放系统调用号,调用返回值也会放在rax中 当系统调用参数小于等于6个时,参数则须按顺序放到寄存器 rdi,rsi,rdx,r10,r8,r9中。 如果系统调用的参数数...阅读全文

博文 2020-05-30 20:47:04 flhs

Go

go 协程如何实现;使用的m:n调度模型,即任意数量的用户态协程可以运行在任意数量的线程上M:os线程(即操作系统内核提供的线程),G:goroutine,其包含了调度一个协程所需要的堆栈以及instruction pointer(IP指令指针),以及其他一些重要的调度信息。P:M与P的中介,实现m:n 调度模型的关键,M必须拿到P才能对G进行调度,P其实限定了golang调度其的最大并发度 2个M分别拿到context P在运行G,M只有拿到context P才能执行goroutine。被执行的goroutine在运行过程中调用 go func() ,会创建一个新的对应func() 的goroutine,并将这个goruotine加入到runqueue(就绪待调度的goroutine队列,...阅读全文

博文 2020-06-08 01:33:16 陈德华

Golang随谈——浅瞰底层:Go的并发调度模型

调度器分析 国内喜欢把Go的并发模型称为G-M-P模型,但在网上一查,貌似国外并没有这样的定义,他们喜欢直接称其为Go Scheduler——Go的调度器。不管如何,G-M-P都是Go调度器中的重要概念,它们都定义在sys/runtime/runtime2.go文件中,让我们看看它们都代表什么吧: G for Goroutine,定义于struct g,其存放着Goroutine的状态信息,如保存着Goroutine的执行堆栈信息、Goroutine的等待信息和变量的GC信息等信息。我们每用关键字go创建一个Goroutine,其在go程序的底层都创建了一个对应的G对象。 M for Machine,定义于struct m,对应着操作系统的工作线程,其和物理处理器线程对应,它负责任务的调度,...阅读全文

博文 2020-02-10 11:34:23 2hwang

Go 并发原理

Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。 并发(concurrency)和并行(parallellism) 并发(concurrency):两个或两个以上的任务在一段时间内被执行。我们不必care这些任务在某一个时间点是否是同时执行,可能同时执行,也可能不是,我们只关心在一段时间内,哪怕是很短的时间(一秒或者两秒)是否执行解决了两个或两个以上任务。 并行(parallellism):两个或两个以上的任务在同一时刻被同时执行。 并发说的是逻辑上的概念,而并行,强调的是物理运行状态。并发“包含”并行。 Go的CSP并发模型 Go实现了两种并发形式。第一种是大家普遍认知的:多线程共享内存。其实就是Java或者C++...阅读全文

应用容器化优化指南 - Golang篇

前言 随着容器技术的兴起,越来越多不同类型的应用开始使用容器的方式进行交付。Golang作为服务器端非常热门的一门语言同时也是容器技术的主要编写语言备受关注。那么将一个Golang应用进行容器化的时候,需要注意哪些事情,在出现问题时该如何进行调优和诊断呢? 先谈谈Golang本身的设计 Golang是谷歌发布的第二款开源编程语言。Golang专门针对多处理器系统应用程序的编程进行了优化,使用Golang编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。Golang在容器相关的场景和领域以及高并发的服务器程序场景下扮演着非常重要的角色。 Golang具有如下三个特点: 简洁 快速 安全 并行 有趣 开源 内存管理 数组安全 编译迅速 在学习一门语言前,通常我会主要关注如下三个...阅读全文

博文 2018-11-02 16:34:41 阿里云云栖社区

(十三)golang 逃逸分析

Golang逃逸分析 介绍逃逸分析的概念,go怎么开启逃逸分析的log。 以下资料来自互联网,有错误之处,请一定告之。 sheepbao 2017.06.10 什么是逃逸分析 wiki上的定义 In compiler optimization, escape analysis is a method for determining the dynamic scope of pointers - where in the program a pointer can be accessed. It is related to pointer analysis and shape analysis. When a variable (or an object) is allocated in a ...阅读全文

博文 2019-07-01 20:33:01 杰克慢

彻底搞清楚Java并发 (一) 基础

多线程编程是为了让程序运行得更快,但是不是说,线程创建地越多越好,线程切换的时候上下文切换,以及受限于硬件和软件资源的限制问题 上下文切换 单核CPU同样支持多线程编程,CPU通过给每个线程分配CPU时间片来实现这个机制,时间片是CPU分配给各个线程的时间,这个时间片非常短,所以就不得不通过切换线程来执行(时间片一般是几十毫秒) 当前任务执行一个时间片后,会切换到下一个任务,但是,在切换前会保存上一个任务的状态,这样的话下次这条线程获取到时间片之后就可以恢复这个任务的状态 协程 协程说通俗一点就是由线程调度的线程,操作系统创建一个进程,进程再创建若干个线程并行,线程的切换由操作系统负责调度,Java语言等线程其实与操作系统线程是1:1的关系,每个线程都有自己的Stack,Java在64位操作...阅读全文

博文 2018-11-23 21:34:38 ChaLLengerZeng

Spring 中获取 request 的几种方法,及其线程安全性分析

概述在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址、请求的url、header中的属性(如cookie、授权信息)、body中的数据等。由于在Spring MVC中,处理请求的Controller、Service等对象都是单例的,因此获取request对象时最需要注意的问题,便是request对象是否是线程安全的:当有大量并发请求时,能否保证不同请求/线程中使用不同的request对象。 这里还有一个问题需要注意:前面所说的“在处理请求时”使用request对象,究竟是在哪里使用呢?考虑到获取request对象的方法有微小的不同,大体可以分为两类:(1)在Spring的Bean中使用request对象:既包括Controller...阅读全文

博文 2019-02-21 18:34:41 MyBatis

彬哥笔记--21 Go语言单利模式

大家好,我是彬哥,本节给大家讲下go语言设计模式相关,抛砖引玉了,主要是针对Go语言单利使用。 原文链接地址 单例解决了什么? 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 复制代码 这个解释足够简单。说白了就是假如我们希望我们在我们的系统中该类仅仅存在1个或0个该类的实例。虽然单例模式很简单,但是熟悉java的同学可能了解,单例模式有很多写法,懒汉式、饿汉式、双重锁。。。 这么多形式,难道有什么目的?确实,不过他们的目的很明确,就是保证在一种特殊情况下的单例-并发。 ok,既然了解了单例模式,那下面我们就开始用代码描述一下单例模式。首先是最简单的单例,这里我们并不去考虑并发的情况。 package manager import ( "fmt" ) var m *Manager f...阅读全文

博文 2019-03-05 14:35:07 Golang语言社区

Kafka 重平衡机制

微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制,我尽量做到图文并茂通俗易懂。 重平衡的作用 重平衡跟消费组紧密相关,它保证了消费组成员分配分区可以做到公平分配,也是消费组模型的实现,消费组模型如下: image.png 从图中可以找到消费组模型的几个概念: 同一个消费组,一个分区只能被一个消费者订阅消费,但一个消费者可订阅多个分区,也即是每条消息只会被同一个消费组的某一个消费者消费,确保不会被重复消费; 一个分区可被不同消费组订阅,这里有种特殊情况,加...阅读全文

博文 2019-10-31 20:33:01 aside section._1OhGeD

HashMap原理摘要

HashMap介绍 HashMap是我们编程时经常会使用到的数据结构。这个数据结构的最大好处是能够帮助我们快速定位在内存中的某一个内容。 例如在Java中,我们快速取得Key所对应的值 //假设 map 是一个HashMap map.get("Key"); 原理 HashMap就是使用哈希函数将一个键映射到一个桶中,这个桶中就可能包含该键对应的值。 哈希函数 HashMap的关键就在于哈希函数的选择。哈希函数就将一个Key映射成一个序列的Index的操作。在Java中,哈希函数将Key这个对象,转换成一个数组的下标。 image.png 因为Key的集合往往远远大于我们保存数据的序列,所以哈希函数的的难度就在于需要将Key生成的这个Index尽量平均的分布在...阅读全文

golang协程实现探讨

问题一:介绍一下协程的运行时runtime,以及他跟协程有什么关系,为什么需要先介绍它?答:你要能从根本上了解一下这个语言的实现,才能更好的知道协程是怎么实现的。首先它是一个二进制的应用程序,这就和c#,python.lua语言有点不同,他们只是编译成一种中间代码,然后需要一个运行的程序去读取翻译他们,这个运行的程序一般理解为运行时。golang把和操作系统的系统调用、协程实现、统一管理(调度器)、gm。做了一个统一的封装,叫做运行时,我们编译golang项目的时候会先编程合成文件,然后在链接的时候,他会链接golang已经封装好的运行时文件。最后合成应用程序。问题二:介绍一下golang的大体设计想法?答:最早golang是创建了几个线程,然后在全局区域创建了一个队列,然后处理单元会放入这...阅读全文

博文 2020-02-27 07:32:39 盈朔

《Go语言四十二章经》第二十三章 锁

《Go语言四十二章经》第二十三章 锁 作者:李骁 ## 23.1 同步锁 Go语言包中的sync包提供了两种锁类型:sync.Mutex和sync.RWMutex,前者是互斥锁,后者是读写锁。 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段,在Go中,似乎更推崇由channel来实现资源共享和通信。它由标准库代码包sync中的Mutex结构体类型代表。只有两个公开方法:调用Lock()获得锁,调用unlock()释放锁。 * 使用Lock()加锁后,不能再继续对其加锁(同一个goroutine中,即:同步调用),否则会panic。只有在unlock()之后才能再次Lock()。异步调用Lock(),是正当的锁竞争,当然不会有panic了。适用于读写不确定场景,即读写次数没有明显的区别...阅读全文

博文 2018-10-12 20:28:08 roteman

goroutine、channel原理

goroutine原理 概念介绍 并发 ⼀个CPU上能同时执⾏多项任务,在很短时间内,CPU来回切换任务执⾏(在某段很短时间内执⾏程序a,然后⼜迅速得切换到程序b去执⾏),有时间上的重叠(宏观上是同时的,微观仍是顺序执⾏),这样看起来多个任务像是同时执⾏,这就是并发。 并⾏ 当系统有多个CPU时,每个CPU同⼀时刻都运⾏任务,互不抢占⾃⼰所在的CPU资源,同时进⾏,称为并⾏。 进程 CPU在切换程序的时候,如果不保存上⼀个程序的状态(context--上下⽂),直接切换下⼀个程序,就会丢失上⼀个程序的⼀系列状态,于是引⼊了进程这个概念,⽤以划分好程序运⾏时所需要的资源。因此进程就是⼀个程序运⾏时候的所需要的基本资源单位(也可以说是程序运⾏的⼀个实体)。 线程 CPU切换多个进程的时候,会花费...阅读全文

博文 2020-05-28 21:32:44 强某某

简析Go与Java内存管理的差异

前 言 从实践中看,Golang(以下简称Go)应用程序比Java占用更少的内存,这与它们的运行时环境有关,其运行时自带了内存动态分配和自动垃圾回收的管理机制,本文通过分析Go与Java在内存管理机制上的差异,以期对两者在运行时内存方面有更进一步的认识。本文以Go(1.12)和当前使用较多的JDK8 HotSpot VM为例进行说明。本篇文章包含以下内容:介绍Go与Java的运行时内存结构差异介绍Go与Java的内存资源占用差异介绍Go与Java如何为对象分配内存介绍Go与Java的内存回收策略差异 内存结构差异应用程序要能在linux系统上运行(其他平台类似),其可执行文件要求符合ELF规范(Executable and Linkable Format,可执行和可链接格式)。操作系统加载目...阅读全文

博文 2019-06-11 17:32:56 安静的少女

Golang Sync.Pool浅析

sync pool使用来存放临时变量的一个缓冲区,但是这个缓冲区并不可靠,每次gc的时候,都会首先清除缓冲区,所以,假如一个slice仅仅存放在 Pool 中,而没有其他地方引用,则会被当成垃圾清理掉。 概念 A Pool is a set of temporary objects that may be individually saved and retrieved.Any item stored in the Pool may be removed automatically at any time without notification. If the Pool holds the only reference when this happens, the item might b...阅读全文

博文 2019-08-05 13:32:39 tyloafer

源码角度解析Go语言并发[1]---M,P,G的定义,状态转换及一些"边角料"

载至本人知乎文章!还望您点赞,收藏! 从这篇文章开始我将尝试从源码的角度解析Go语言并发之道。这次的源码解析可比python源码解析难度要大的多。鄙人不才,有问题还请指教。 啰嗦一句,还请阅读我之前的文章,了解协程和Go语言并发模型的基本知识。 go语言并发原理和机制【一】 go语言并发原理和机制【二】 目录 目录 1. Go程序入口——m0、g0 go语言并发模型调度器的源码大多集中在/runtime/文件夹之下。此文件夹之下有很多文件。包括 .s 类型的汇编码和 .go 类型的go语言源码。 首先编译器通过rt0_linux_arm64.s文件开启Go语言调度器。此文件名后半部分对应着不同的系统版本。 image image image 这些文件大多完成一些初始化工作。这里我选则研究 l...阅读全文

博文 2020-02-11 00:32:45 甘蔗JS

Go goroutine理解

Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主Goroutine。当程序启动时,它会自动创建。 为了更好理解Goroutine,现讲一下线程和协程的概念 线程(Thread):有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程的切换一...阅读全文

go语言有哪些优势?Go语言的核心特性有哪些

Go语言,作为编程语言的后生,站在巨人的肩膀上,吸收了其他一些编程语言的特点。Go 编程语言是一个开源项目,它使程序员更具生产力。Go 语言具有很强的表达能力,它简洁、清晰而高效。得益于其并发机制, 用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型系统则使程序结构变得灵活而模块化。 Go 代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机制和强大的运行时反射机制。 它是一个快速的、静态类型的编译型语言,感觉却像动态类型的解释型语言。(摘取自官网)一、思想Less can be more大道至简,小而蕴真让事情变得复杂很容易,让事情变得简单才难深刻的工程文化二、核心特性Go语言之所以厉害,是因为它在服务端的开发中,总能抓住程序员的痛点,以最直接、简单、高效、稳定的方式来解决问...阅读全文

博文 2019-03-28 20:34:43 qfliweimin

GoLang-Scheduling In Go : Part I - OS Scheduler

Scheduling In Go系列文章 本文主要针对Go语言中的调度。 目录 Part I - OS Scheduler Part II - Go Scheduler Part III - Concurrency Part I - OS Scheduler 第一部分,将提供对Go中调度器背后的机制和语义的理解。 Introduction Go调度的设计与实现提供了高效率和高性能的多线程,然而如果你的Go程序多线程设计不支持Go调度的工作,那这也将无济于事。本文主要集中于调度程序的高级机制和语义,展现出多线程工作的一些细节,从而帮助你更好的做出工程决策。 OS Scheduler 操作系统调度器是软件非常重要的部分。我们的程序在运行运行的时候只是一串需要被顺序执行的指令,为了执行这些指令,操...阅读全文

博文 2020-03-16 09:32:57 帘外五更风

Java内存模型:看Java如何解决可见性和有序性问题

上一期我们讲到在并发场景中可见性、原子性、有序性导致的问题常常会违背我们的直觉,从而成为并发的BUG之源。这三者在编程领域属于共性问题,所有的编程语言都会用到,Java 在诞生之初就支持多线程,自然也有针对这三者的技术方案,而且在编程语言领域处于领先地位。理解Java 解决并发问题的解决方案,对于解决其他语言的解决方案有触类旁通的效果。 今天 我们来看下解决可见性、有序性导致的问题,也就是今天的主角:--Java 内存模型 Java 内存模型这个概念,在职场很多面试中都会考核到,是一个热门的考点,也是一个人并发水平的具体体现,原因是当并发程序出问题时,需要一行一行的检查代码,这个时候只有掌握了Java 内存模型,才能慧眼如炬的发现问题。 什么是 Java 内存模型? 你已经知道,导致可见性的...阅读全文

Handler 源码解析(Java 层)

从很早开始就认识到 Handler 了,只不过那时修为尚浅,了解的不够深刻,也没有应用自如。不过随着工作时间的增长,对 Handler 又有了更深层次的认识,于是有了这篇博客,希望尽可能的总结出多的知识点。 Handler 在 Java 层源码主要有 4 个类:Looper、MessageQueue、Message、Handler。我归纳了他们的几个主要知识点: Looper:sThreadLocal、Looper.loop();Message:数据结构、消息缓存池;MessageQueue:enqueueMessage、next、管道等待、同步消息隔离、idleHandler;Handler:send/post、dispatchMessage 消息处理优先级。LooperLooper 数据...阅读全文

博文 2019-04-28 13:58:31 demaxiya

阿里免费分享Java高级开发

课程介绍 当你已经熟练的掌握了面向对象中的各种概念后,是否会对这些知识是如何使用的产生浓厚的兴趣?本课程主要针对于已经掌握了JAVA核心开发技术的读者准备,讲解了JAVA多线程、常用类库、IO编程、网络编程、类集框架、JDBC等与Java实际应用有关的开发技术。 课程目标 • 掌握Java多线程开发、网络编程、JDBC等 适合人群 • Java开发者 课时列表 • 课时1:Eclipse开发工具(Eclipse简介) • 课时2:Eclipse开发工具(使用JDT开发程序) • 课时3:Eclipse开发工具(debug调试) • 课时4:Eclipse开发工具(junit测试工具) • 课时5:Java基础新特性(可变参...阅读全文

Golang并发编程

Goroutine 在Go语言中,语言本身就已经实现和支持了并发, 我们只需要通过go关键字来开启goroutine即可。 gouroutine其实就是一种协程,类似其他语言中的coroutine, 是在编译器或虚拟机层面上的多任务。它可以运行在一个或多个线程上,但不同于线程,它是非抢占式的,所以协程很轻量。 上述代码就开启了1000个协程,在1ms内不断的打印字符串,这里需要注意两个点: time.Sleep 在main函数退出前,Sleep了1ms。这是因为当main函数退出时,之前开的协程也会随着退出,如果不Sleep,则无法看到打印信息。 匿名函数将变量i作为参数赋值传入。 如果不传参,变量i也能被使用,但是是以引用的方式。而i在main函数中在不断自增,导致在goroutine打印...阅读全文

博文 2019-06-24 20:02:44 千锋IT

图解Go里面的互斥锁mutex了解编程语言核心实现源码

1. 锁的基础概念 1.1 CAS与轮询 1.1.1 cas实现锁 在锁的实现中现在越来越多的采用CAS来进行,通过利用处理器的CAS指令来实现对给定变量的值交换来进行锁的获取 1.1.2 轮询锁 在多线程并发的情况下很有可能会有线程CAS失败,通常就会配合for循环采用轮询的方式去尝试重新获取锁 1.2 锁的公平性 锁从公平性上通常会分为公平锁和非公平锁,主要取决于在锁获取的过程中,先进行锁获取的线程是否比后续的线程更先获得锁,如果是则就是公平锁:多个线程按照获取锁的顺序依次获得锁,否则就是非公平性 1.3 饥饿与排队 1.3.1 锁饥饿 锁饥饿是指因为大量线程都同时进行获取锁,某些线程可能在锁的CAS过程中一直失败,从而长时间获取不到锁 1.3.2 排队机制 上面提到了CAS和轮询锁进行...阅读全文

博文 2019-12-23 15:34:28 代码仔

Go并发

package main import ( "fmt" "runtime" "sync" "time" ) var c int func counter() int { c++ return c } func main2() { a := 100 go func(x, y int) { time.Sleep(time.Second) println("go:", x, y) }(a, counter()) a += 100 println("main:", a, counter()) time.Sleep(time.Second * 3) } // 进程退出不会等待并发任务结束,可用通道阻塞,然后发出退出信号 func main3() { exit := make(chan struct{}...阅读全文

博文 2020-03-07 22:32:40 xiongkun01

Golang 关于通道 Chan 详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/netdxy/article/details/54564436 首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行。golang的线程是一种并发机制,而不是并行。它们之间的区别大家可以上网搜一下,网上有很多的介绍。 下面我们先来看一个例子吧 import( "fmt" ) funcmain(){ go fmt.Println("1") fmt.Println("2") } 在golang里面,使用go这个关键字,后面再跟上一个函数就可以创建一个线程。后面的这个函数可以是已经写好的函数,也可以是一个匿名函数 funcmain(){ var i=...阅读全文

博文 2018-12-28 23:31:33 netdxy

[译] part 21: golang Goroutines

文地址:Part 21: Goroutines 原文作者:Naveen R 译者:咔叽咔叽 转载请注明出处。 在前面的教程中,我们讨论了并发以及它与并行的不同之处。在本教程中,我们将讨论如何使用Goroutines在 Go 中实现并发性。 什么是Goroutines Goroutines是与其他函数或方法同时运行的函数或方法。 Goroutines可以被认为是轻量级线程。与线程相比,创建Goroutine的成本很小。因此,Go 应用程序通常可以轻松运行数千个Goroutines。 Goroutines相较线程的优势 与线程相比,Goroutines非常轻量化。它们的堆栈大小只有几 kb,堆栈可以根据应用程序的需要而伸缩,而在线程的情况下,堆栈必须固定指定大小。 Goroutines被复用到较...阅读全文

博文 2019-04-02 00:34:38 咔叽咔叽_7647

认识Java异步编程

一 、认识异步编程 通常Java开发人员喜欢使用同步代码编写程序,因为这种请求(request)/响应(response)的方式比较简单,并且比较符合编程人员的思维习惯;这种做法很好,直到系统出现性能瓶颈;在同步编程方式时由于每个线程同时只能发起一个请求并同步等待返回,所以为了提高系统性能,此时我们就需要引入更多的线程来实现并行化处理;但是多线程下对共享资源进行访问时,不可避免会引入资源争用和并发问题;另外操作系统层面对线程的个数是有限制的,不可能通过无限的增加线程数来提供系统性能;最后使用同步阻塞的编程方式还会导致浪费资源,比如发起网络IO请求时候,调用线程就会处于同步阻塞等待响应结果的状态,而这时候调用线程明明可以去做其他事情,等网络IO响应结果返回后在对结果进行处理。 可见通过增加单机...阅读全文

博文 2019-12-25 01:32:52 阿里加多