已经把《Go语言并发之道》通读了一遍,非常不错的一本书,对于理解掌握Go语言的并发知识有很大的帮助,接下来我会把书中有用的知识通过代码示例出来,把一些比较好的知识点记录下来。首先我们来看一段代码 vardataint gofunc(){data}() ifdata0{ fmt.Println("thevalueis0.") }else{ fmt.Printf("thevalueis%v.\n",data) } 这段代码我们想把data+1后打印出来,但是结果打印出来的效果是“thevalueis0.”,没有达到我们的预期,主要是因为调用data的这个goroutine没有先执行。并发的难...

  sEkVL1ZJlmIQ   2023年11月02日   46   0   0 Go

今天这篇笔记重点讲goroutine 首先怎么定义goroutine 很简单,在方法前面加上go就可以了 funcmain(){ gosayHello() } funcsayHello(){ fmt.Println("hello") } 也可以直接这样写,基于匿名函数 gofunc(){ fmt.Println("hello") }() go语言至少有一个maingoroutine,另外调用的sayhellogoroutine和maingoroutine并发执行,会在maingoroutine退出后退出,所以我们上面的代码是有问题的,它不会打印出"hello".因为maingoro...

  sEkVL1ZJlmIQ   2023年11月02日   49   0   0 Go

今天这篇笔记我们来学习锁:互斥锁(Mutex)和读写锁(RWMutex) 互斥锁(Mutex) 首先我们来看一段代码,没有加锁的情况下,两个goroutine同时修改一个变量,会发生什么 funcmain(){ varcountint increment:=func(){ count fmt.Printf("Incrementing:%d\n",count) } decrement:=func(){ count-- fmt.Printf("Decrementing:%d\n",count) } vararithmeticsync.WaitGroup fori:...

  sEkVL1ZJlmIQ   2023年11月02日   103   0   0 Go

今天这篇笔记我们记录sync包下面的Cond,Once和Pool Cond cond就是条件,当条件不满足的时候等待Wait(),条件满足后,继续执行。通过Signal()和Broadcast()来通知wait结束,继续执行。我们先来看一个Signal通知的例子 funcmain(){ c:=sync.NewCond(&sync.Mutex{}) queue:=make([]interface{},0,10) removeFromQueue:=func(delaytime.Duration){ time.Sleep(delay) c.L.Lock() queue=...

  sEkVL1ZJlmIQ   2023年11月02日   62   0   0 Go

今天这篇笔记我们来记录Channel和Select,Go语言并发中Channel是goroutine传递数据的桥梁,是非常重要的一个工具。 定义Channel 双向Channel 要定义一个channel很简单,只需要在类型前面加上chan就可以了,stringStream:=make(chanstring)这样就是定义和实例化了一个string类型的双向channel,先来看一个HelloWorld的例子 funcmain(){ stringStream:=make(chanstring) gofunc(){ stringStream<"Hellochannels" }()...

  sEkVL1ZJlmIQ   2023年11月02日   99   0   0 Go

今天这篇笔记我们来学习一下context包context包的一个应用场景是可以通过它控制goroutine的取消,超时等。我们先来看一个取消的例子 context.WithCancel funcdoSomething(ctxcontext.Context){ ctx,cancelctx:=context.WithCancel(ctx) printCh:=make(chanint) godoAnother(ctx,printCh) fori:=0;i<3;i{ printCh<i } cancelctx() fmt.Println("dosomethingfi...

  sEkVL1ZJlmIQ   2023年11月02日   52   0   0 Go

今天这篇笔记我们来学习Go限流限流是分布式系统中经常需要用到的技术,因为我们让请求没有限制,很容易就出现某个用户开很多线程把我们的服务拉跨,进而影响到别的用户。 限流 我们来看下Go语言层面可以怎么做到限流,先看一段不限流的代码, typeAPIConnectionstruct{} funcOpen()APIConnection{ return&APIConnection{} } func(aAPIConnection)ReadFile(ctxcontext.Context)error{ //假装我们在这里有运行 returnnil } func(aAPIConnection...

  sEkVL1ZJlmIQ   2023年11月02日   67   0   0 Go

前言 最近在极客时间上面学习丁雪丰老师的《玩转Spring全家桶》,其中讲到访问Redis的方式,我专门把他们抽出来,在一起对比下,体验一下三种方式开发上面的不同,分别是这三种方式 RedisTemplate JPARepository Cache 开始准备 开始之前我们需要有Redis安装,我们采用本机Docker运行Redis,主要命令如下 dockerpullredis dockerrun--namemy_redis-d-p6379:6379redis dockerexec-itmy_redisbash redis-cli 前面两个命令是启动redisdocker,后两个是连接到d...

  sEkVL1ZJlmIQ   2023年11月01日   44   0   0 Java

最近在极客时间上面学习丁雪丰老师的《玩转Spring全家桶》,看到一个在application.properties里面生成随机数的例子,觉得很厉害,带着崇拜的心情去阅读了一下Spring的源码,总算搞清楚了它是怎么工作的,阅读优秀的源代码是一个很不错的学习方式,这篇文章就是记录一下这个学习的过程。 还是先通过示例来进入学习 首先我们建一个springboot的工程,入口程序如下,就是打印出两个从配置文件中定义的value @SpringBootApplication @Slf4j publicclassPropertySourceDemoApplicationimplementsApplic...

  sEkVL1ZJlmIQ   2023年11月01日   68   0   0 Java

最近在极客时间上面学习丁雪丰老师的《玩转Spring全家桶》,学到了服务注册中心这块,动手实践了一下,老师的视频录制是3年前,现在也有了些变化,自己也动手解决了一下,只有自己写一写才理解的更加细致一些,不然光看一遍视频,有点走马观花。现将主要过程记录如下 准备工作 首先在本地docker上面安装Consul dockerpullconsul dockerrun--namemy_consul-d-p8500:8500-p8600:8600/udpconsul 在8500端口上面启动了consul,在浏览器上输入http://localhost:8500/就可以看到打开如下图的一个界面。 编写两...

  sEkVL1ZJlmIQ   2023年11月01日   61   0   0 Java

CircuitBreaker断路器 服务熔断是为了保护我们的服务,比如当某个服务出现问题的时候,控制打向它的流量,让它有时间去恢复,或者限制一段时间只能有固定数量的请求打向这个服务。这些都是保护措施。我在实际工作中也确实遇到过,数据库出现问题了,进而导致Web服务出现问题了,导致不依赖数据库的服务也出现问题了,出现一连串问题。这次学习《玩转Spring全家桶》,丁雪丰老师给了使用resilience4j的例子。丁老师的例子是2019年的,这个框架已经修改了些方法,所以我自己也花了些时间来理解了它的用法。现将过程记录下来。首先POM文件引入 <dependency> <grou...

  sEkVL1ZJlmIQ   2023年11月01日   58   0   0 Java

前言 这周学习下Flink相关的知识,学习到一个读写Kafka消息的示例,自己动手实践了一下,别人示例使用的是普通的JavaMain方法,没有用到springboot.我们在实际工作中会使用springboot。因此我做了些加强,把流程打通了,过程记录下来。 准备工作 首先我们通过docker安装一个kafka服务,参照Kafka的官方指导文档https://developer.confluent.io/tutorials/kafka-console-consumer-producer-basics/kafka.html主要的是有个docker-compose.yml文件 --- versio...

  sEkVL1ZJlmIQ   2023年11月01日   62   0   0 Java

前言 经常看到说gRPC怎么好的文章,实际工作中也没有体验过,这次看了一下它的HelloWorld程序,记录一下这个过程。RPC是RemoteProduceCall的缩写,就是远程调用,调用远程的代码像本地一样。Java里面比较有名的RPC框架Dubbo,但它只支持Java。gRPC是google开源的RPC框架,使用HTTP2,支持很多种语言:Java,GO,.NetCore,C,它都有对应的支持。这篇初体验就打算使用Java做服务端,分别使用Java和GO作为客户端。 Java服务端和客户端 首先我们来建一个Java服务端。使用gRPC最基础的一步是protobuf文件,这里我们直接使用H...

  sEkVL1ZJlmIQ   2023年11月01日   97   0   0 Java

前言 PostgreSQL可以直接存储二进制字段,而上周我学习了通过Protobuf来做grpc通信格式,当然也是可以序列化为二进制存入数据库的,需要的时候从数据库查询出来,通过protobuf来转成对应的Java对象,本文就是来尝试一下这个思路。 PostgreSQL安装 使用docker来安装PostgreSQL,参照网站https://hub.docker.com/_/postgres命令如下dockerrun--namemy-postgres-p5432:5432-ePOSTGRES_PASSWORD=kentest123$-dpostgres 以上命令会去下载postgresql的i...

  sEkVL1ZJlmIQ   2023年11月01日   29   0   0 Java

前言 最近看文章说如何把Postgresql的数据同步给别的数据源,可以利用它的WAL,具体怎么操作没有说,我自己找到一篇文章https://www.cnblogs.com/xiongmozhou/p/14817641.html可以利用FlinkCDC。我自己正好前段时间也看过Flink,把这个知识串起来也很有意义,于是开始动手试了一下,期间也遇到些困难,也尝试解决了,有些原理不是很清晰,记录下来,后面看能不能解决。 Postgresql配置 我们使用上篇文章搭建的Postgresql数据库,要让Postgresql支持同步给其它数据源,一个最关键的配置是更改wal日志方式为logical,这...

  sEkVL1ZJlmIQ   2023年11月01日   97   0   0 Java

前言 本文继续学习PostgreSQL,看到PostgreSQL有个Array字段,感觉可以用来存储某种表,比如股票每天的价格,我们称为market_price表,先来看下最开始market_price表的定义 createtablemarket_price( idchar(10), trade_datedate, openfloat, highfloat, lowfloat, closefloat, primarykey(id,trade_date) ); 表说明 id每支股票有个对应的编号,trade_date是交易日期,openhighlowclose分别代表开盘价,最高价,最低价,收...

  sEkVL1ZJlmIQ   2023年11月01日   25   0   0 Java

前言 读张开涛写的《亿级流量网站架构核心技术》里面讲到使用Java缓存:堆内缓存,堆外缓存,磁盘缓存,分布式缓存。介绍了几种缓存工具:GauvaCache,Ehcache和MapDB。其中GauvaCache是google开发的,它只提供了堆内缓存。Ehcache支持的比较全面,基本都支持了。之前我没有使用过这些缓存工具,书读一遍也没有什么印象,自己动手写一下能体会更深。这篇博客就是基本的使用,然后加上JMH来对比一下他们的性能。JMH也是第一次使用,其中也花了些时间,以后需要做性能对比的时候它能帮上忙。 Ehcache使用 要使用Ehcache首先要引入POM文件 <dependenc...

  sEkVL1ZJlmIQ   2023年11月01日   62   0   0 Java

前言 这周工作比较忙,在学习上面就温习了一下动态代理,以前也看过这块的知识,但是一直没有动手去写下代码。学习就是这样,不动手写一写总有种没有掌握的感觉,记录下这个学习过程动态代理有什么用呢?它的作用就是增强,对于一个方法,我想在执行它之前执行另外一个log方法,那我可以修改代码,我可以直接去加,但是假如有很多方法都需要加这个log,那工作量就大了,我们可以用动态代理来加上这个log方法,然后通过代理来调用原来的方法,达到不修改原来方法,增加功能的目的。动态代理实现上有两种方法JDK动态代理和CGLib动态代理,下面我们分别来演示一下 JDK动态代理 JDK动态代理是JDK自带的,通过反射来实现...

  sEkVL1ZJlmIQ   2023年11月01日   26   0   0 Java

前言 这周学习尼恩编著的《Netty、Redis、ZooKeeper高并发实战》,这本书写的很不错,通过十几个例子带领大家去体会高并发如何实现,这周我看了最基础的JavaNOI部分,读书的时候好像明白了作者写的内容,但是又体会不深,非得自己动手写一些书上得例子,有时候还要改动下例子,才能体会深刻,得出自己得结论。下面我们进入例子演示。 BlockingIO 首先我们会来一个BlockingIO的例子,也就是同步阻塞方式,在Java中,默认创建的socket都是阻塞的。先来看Server端代码,写一个继承ServerSocket的类 @Slf4j publicclassBlockReceiveS...

  sEkVL1ZJlmIQ   2023年11月01日   130   0   0 Java

前言 本周继续学习尼恩编著的《Netty、Redis、ZooKeeper高并发实战》,一些资源也贴在这里,自己以后想看还可以找到,这个是在博客园的一个入口https://www.cnblogs.com/crazymakercircle/p/9904544.html。这周主要学习了Netty客户端和服务端通信,书是由浅入深的在进行,从SocketNOI通信到Reactor反应器模式,再到Netty框架,示例代码都在https://gitee.com/crazymaker/netty_redis_zookeeper_source_code.git中可以看到,书结合源代码,自己在动手试验一下,感觉还...

  sEkVL1ZJlmIQ   2023年11月01日   37   0   0 Java
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~