摘要:
理解Go Interface1 概述Go语言中的接口很特别,而且提供了难以置信的一系列灵活性和抽象性。接口是一个自定义类型,它是一组方法的集合,要有方法为接口类型就被认为是该接口。从定义上来看,接口有两个特点:接口本质是一种自定义类型,因此不要将Go语言中的接口简单理解为C++/Java中的接口,后者仅用于声明方法签名。接口是一种特殊的自定义类型,其中没有数据成员,只有方法(也可以为空)。接口是完...
阅读全文
posted @ 2017-08-30 14:31
张伯雨
阅读(838)
推荐(0)
摘要:
深入讨论channel timeoutGo 语言的 channel 本身是不支持 timeout 的,所以一般实现 channel 的读写超时都采用 select,如下:select { case <-c: case <-time.After(time.Second): } 这两天在写码的过程中突然对这样实现 channel 超时产生了怀疑,这种方式真的好吗?于是我写了这样一个测试程序:packa...
阅读全文
posted @ 2017-08-30 14:29
张伯雨
阅读(727)
推荐(0)
摘要:
fasthttp中的协程池实现协程池可以控制并行度,复用协程。fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池。实现并不复杂,我们可以参考他的设计,写出高性能的应用。入口// server.go func (s *Server) Serve(ln net.Listener) error { var lastOverflowErrorTime time.Ti...
阅读全文
posted @ 2017-08-30 14:28
张伯雨
阅读(846)
推荐(0)
摘要:
Golang 知识点总结目录 [−]各种类型复制的时候的花费可使用内建函数的类型 (len、cap、close、delete、make)内建容器类型的值比较组合类型T{...}的值比较零值是nil的类型编译时被执行的函数不能被寻址的值不支持比较的类型可命名的源代码元素命名的源代码元素可以使用 ()分组声明可以在函数内外声明的源代码元素可以返回一个可选bool返回值的表达式使用channel机制永远...
阅读全文
posted @ 2017-08-30 14:10
张伯雨
阅读(264)
推荐(0)
摘要:
Go 的标准库包含了一些很不错的编码和解码包,里面涵盖了大量的编码方案。一切数据,不管是CSV,XML,JSON,还是 gob —— 一个 Go 特定的编码格式,都涵盖在内,并且,这些包都非常容易上手使用。 事实上,它们中的大多数都不需要再添加任何代码,你只需插入数据,它就会输出编码后的数据。不过,并不是所有的应用程序都乐于处理这种到 JSON 展现的一对一映射。Struct 标记可以涵盖一些场景...
阅读全文
posted @ 2017-08-30 14:09
张伯雨
阅读(654)
推荐(0)
摘要:
import ( "go/parser""go/token" "go/ast" ) func HasMain(file string) (bool, error) { fset := token.NewFileSet() f, err := parser.ParseFile(fset, file, nil, 0)if err != nil {return fal...
阅读全文
posted @ 2017-08-30 14:08
张伯雨
阅读(513)
推荐(0)
摘要:
1、并发并不是并行,前者是优先对时间片的抢占,后者是真多核。 go中多线程时直接要求并行的方法是:亦不可滥用,CPU密集型,并发度很高的场景适用。 2、go起的协程 3、 function that returns a chanel fan-in 二次缓冲 send a chanel on a chanel 利用chanel饥饿阻塞原理实现有序 select 利用select的ok随机执行性,可以...
阅读全文
posted @ 2017-08-30 14:07
张伯雨
阅读(482)
推荐(0)
摘要:
Golang 实现的连接池功能:* 连接池中连接类型为interface{},使得更加通用* 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题* 使用channel处理池中的链接,高效基本用法//factory 创建连接的方法 factory := func() (interface{}, error) { return net.Dial("tcp", "127.0.0.1:...
阅读全文
posted @ 2017-08-30 14:07
张伯雨
阅读(2647)
推荐(0)
摘要:
引言在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法。为了感受更深一点,我们来看一下go的源码。先定义一个最简单的http server如下。12345678func myHandler(w http.ResponseWriter, r *http.Request) { ...
阅读全文
posted @ 2017-08-30 14:06
张伯雨
阅读(470)
推荐(0)
摘要:
引言fasthttp是一个非常优秀的web server框架,号称比官方的net/http快10倍以上。fasthttp用了很多黑魔法。俗话说,源码面前,了无秘密,我们今天通过源码来看一看她的goroutine pool的实现。热身fasthttp写server和原生的net/http写法上基本没有区别,这里就不举例子。直接找到入口函数,在根目录下的server.go文件中,我们从函数Listen...
阅读全文
posted @ 2017-08-30 14:04
张伯雨
阅读(867)
推荐(0)
摘要:
package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface{}{ 0: {"connectstring": "root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8", ...
阅读全文
posted @ 2017-08-30 14:03
张伯雨
阅读(1359)
推荐(0)
摘要:
func GetLocalIP() { host, _ := os.Hostname() addrs, _ := net.LookupIP(host) for _, addr := range addrs { if ipv4 := addr.To4(); ipv4 != nil { fmt.Println("IPv4: ", ipv4) ...
阅读全文
posted @ 2017-08-30 14:02
张伯雨
阅读(269)
推荐(0)
摘要:
http://yougg.github.io/static/gonote/GolangStudy.html
阅读全文
posted @ 2017-08-30 14:02
张伯雨
阅读(200)
推荐(0)
摘要:
//最新版本参见https://github.com/karlseguin/dnscache地址 或者 https://github.com/netroby/dnscache package dnscache// Package dnscache caches DNS lookupsimport ( "net" "sync" "time")//一个域名可能对应多个iptype Reso...
阅读全文
posted @ 2017-08-30 14:01
张伯雨
阅读(555)
推荐(0)
摘要:
// Package xsrftoken provides methods for generating and validating secure XSRF tokens.package xsrftoken // import "golang.org/x/net/xsrftoken"import ( "crypto/hmac" "crypto/sha1" "crypto/sub...
阅读全文
posted @ 2017-08-30 13:59
张伯雨
阅读(1329)
推荐(0)
摘要:
package mainimport ( "encoding/json" "flag" "fmt" "io" "log" "net" "net/http" "os" "os/signal" "runtime" "sync" "syscall" "time")var restApiServer = flag.String(...
阅读全文
posted @ 2017-08-30 13:56
张伯雨
阅读(476)
推荐(0)
摘要:
golang 通过exec Command启动的进程如何关闭的解决办法在用exec包调用的其他进程后如何关闭结束,可以使用context包的机制进行管理,context包的使用详见:https://godoc.org/contextexec.CommandContext方发实现了context,通过context可以对exec启动的进程结束。隐藏程序自身黑窗口的方法:Go build -ldfla...
阅读全文
posted @ 2017-08-30 13:54
张伯雨
阅读(2535)
推荐(0)
摘要:
核心概念在讨论NSQ如何在实践中使用前,先理解NSQ队列的架构原理是非常值得的。它的设计很简单,可以通过几个核心概念来理解。Topic ——一个topic就是程序发布消息的一个逻辑键,当程序第一次发布消息时就会创建topic。Channels ——channel组与消费者相关,是消费者之间的负载均衡,channel在某种意义上来说是一个“队列”。每当一个发布者发送一条消息到一个topic,消息会被...
阅读全文
posted @ 2017-08-30 13:52
张伯雨
阅读(15663)
推荐(0)
摘要:
Go里面的DNSclient没有带任何的缓存,语言层面没有任何的缓存,但是我们可以通过下面这样的代码来这样当我们调用http.Client的时候就会采用这个缓存的ip了,里面用到的dnscache是这个包https://github.com/viki-org/dnscache
阅读全文
posted @ 2017-08-30 13:51
张伯雨
阅读(1224)
推荐(0)
摘要:
熟悉Docker如何提升你在构建、测试并部署Go Web应用程序的方式,并且理解如何使用Semaphore来持续部署。简介大多数情况下Go应用程序被编译成单个二进制文件,web应用程序则会包括模版和配置文件。而当一个项目中有很多文件的时候,由于很多文件没有同步就会导致错误的发生并且产生很多的问题。在本教程中,你将学习如何使用Docker部署一个Go web应用程序,并且认识到Docker将如何改进...
阅读全文
posted @ 2017-08-30 13:50
张伯雨
阅读(6166)
推荐(0)
摘要:
打包前端WebSite到Go程序Coolpy5发布在即,新版本要求服务端程序只是一个运行文件,经历了go的template无数坑后,最后还是放弃了,所以还是要把前端独立开发一个纯前端程序,但是go程序直接build的话并不支持把前端程序编译到最终生成的文件中,所以须要一种方法把前端程序打包进最终生成的运行文件中。所用到的包 github.com/GeertJohan/go.rice下载或编译后会得...
阅读全文
posted @ 2017-08-30 13:49
张伯雨
阅读(699)
推荐(0)
摘要:
1. 现象服务的cpu跑满(golang实现), 并大量报too many open files错误.服务使用systemd来运行,部署在阿里ecs上. 2.分析从日志来看,cpu的上升主要为到达文件数限制引起的,但之前已经更改过系统的文件数及所有用户的文件数,按道理是不应该出现这个问题的,后来查阅资料发现,文件数可以从三个维度限制分别为操作系统限制,用户态限制,以及进程限制,对于这三个维度选取最...
阅读全文
posted @ 2017-08-30 13:46
张伯雨
阅读(441)
推荐(0)
摘要:
fasthttp 文档手册貌似文章有最大长度限制,完整全文地址:https://github.com/DavidCai1993/my-blog/issues/35常量const ( CompressNoCompression = flate.NoCompression CompressBestSpeed = flate.BestSpeed Com...
阅读全文
posted @ 2017-08-30 13:45
张伯雨
阅读(6649)
推荐(0)
摘要:
package mirrorimport ( "github.com/coreos/etcd/clientv3" "golang.org/x/net/context")const ( batchLimit = 1000)// Syncer syncs with the key-value state of an etcd cluster.type Syncer interface...
阅读全文
posted @ 2017-08-30 13:44
张伯雨
阅读(636)
推荐(0)
摘要:
package namingimport ( "encoding/json" etcd "github.com/coreos/etcd/clientv3" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/gr...
阅读全文
posted @ 2017-08-30 13:42
张伯雨
阅读(881)
推荐(0)
摘要:
package concurrencyimport ( v3 "github.com/coreos/etcd/clientv3" "golang.org/x/net/context")// STM is an interface for software transactional memory.type STM interface { // Get returns the va...
阅读全文
posted @ 2017-08-30 13:41
张伯雨
阅读(373)
推荐(0)
摘要:
package concurrencyimport ( "fmt" "sync" v3 "github.com/coreos/etcd/clientv3" "golang.org/x/net/context")// Mutex implements the sync Locker interface with etcdtype Mutex struct { s *Se...
阅读全文
posted @ 2017-08-30 13:40
张伯雨
阅读(359)
推荐(0)
摘要:
package concurrencyimport ( "time" v3 "github.com/coreos/etcd/clientv3" "golang.org/x/net/context")const defaultSessionTTL = 60// Session represents a lease kept alive for the lifetime of a c...
阅读全文
posted @ 2017-08-30 13:40
张伯雨
阅读(295)
推荐(0)
摘要:
package concurrencyimport ( "fmt" v3 "github.com/coreos/etcd/clientv3" "github.com/coreos/etcd/mvcc/mvccpb" "golang.org/x/net/context")func waitDelete(ctx context.Context, client *v3.Clien...
阅读全文
posted @ 2017-08-30 13:39
张伯雨
阅读(339)
推荐(0)
摘要:
package concurrencyimport ( "errors" "fmt" v3 "github.com/coreos/etcd/clientv3" "github.com/coreos/etcd/mvcc/mvccpb" "golang.org/x/net/context")var ( ErrElectionNotLeader = errors.Ne...
阅读全文
posted @ 2017-08-30 13:38
张伯雨
阅读(391)
推荐(0)
摘要:
package clientv3import ( "fmt" "sync" "time" v3rpc "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" mvccpb "github.com/coreo...
阅读全文
posted @ 2017-08-30 13:37
张伯雨
阅读(423)
推荐(0)
摘要:
package clientv3import ( "sync" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc")// Txn is the interface that wraps mini-transactions...
阅读全文
posted @ 2017-08-30 13:36
张伯雨
阅读(372)
推荐(0)
摘要:
package clientv3type SortTarget inttype SortOrder intconst ( SortNone SortOrder = iota SortAscend SortDescend)const ( SortByKey SortTarget = iota SortByVersion SortByCreateRevision ...
阅读全文
posted @ 2017-08-30 13:35
张伯雨
阅读(203)
推荐(0)
摘要:
package clientv3import ( "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc" "...
阅读全文
posted @ 2017-08-30 13:33
张伯雨
阅读(937)
推荐(0)
摘要:
package clientv3import ( "io" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc")type ( DefragmentResponse pb.DefragmentResponse ...
阅读全文
posted @ 2017-08-30 13:32
张伯雨
阅读(347)
推荐(0)
摘要:
package clientv3import pb "github.com/coreos/etcd/etcdserver/etcdserverpb"type opType intconst ( // A default Op has opType 0, which is invalid. tRange opType = iota + 1 tPut tDeleteRange)...
阅读全文
posted @ 2017-08-30 13:32
张伯雨
阅读(646)
推荐(0)
摘要:
package clientv3import ( "sync" "time" "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.g...
阅读全文
posted @ 2017-08-30 13:30
张伯雨
阅读(421)
推荐(0)
摘要:
package clientv3import ( "crypto/tls" "crypto/x509" "io/ioutil" "time" "github.com/coreos/etcd/pkg/tlsutil" "github.com/ghodss/yaml")type Config struct { // Endpoints is a list of...
阅读全文
posted @ 2017-08-30 13:29
张伯雨
阅读(441)
推荐(0)
摘要:
package clientv3import ( pb "github.com/coreos/etcd/etcdserver/etcdserverpb")type CompareTarget inttype CompareResult intconst ( CompareVersion CompareTarget = iota CompareCreated CompareM...
阅读全文
posted @ 2017-08-30 13:28
张伯雨
阅读(379)
推荐(0)
摘要:
package clientv3import ( pb "github.com/coreos/etcd/etcdserver/etcdserverpb")// CompactOp represents a compact operation.type CompactOp struct { revision int64 physical bool}// CompactOption ...
阅读全文
posted @ 2017-08-30 13:27
张伯雨
阅读(201)
推荐(0)
摘要:
package clientv3import ( "crypto/tls" "errors" "fmt" "net" "net/url" "strings" "time" "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" prometheus "github.com/grpc-ecos...
阅读全文
posted @ 2017-08-30 13:26
张伯雨
阅读(676)
推荐(0)
摘要:
package clientv3import ( pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc")type ( Member pb.Member MemberListResponse...
阅读全文
posted @ 2017-08-30 13:26
张伯雨
阅读(270)
推荐(0)
摘要:
package clientv3import ( "net/url" "strings" "sync" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes")// ErrNoAddrAvilable is returned by Get() when ...
阅读全文
posted @ 2017-08-30 13:25
张伯雨
阅读(492)
推荐(0)
摘要:
package clientv3import ( "fmt" "strings" "github.com/coreos/etcd/auth/authpb" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc")...
阅读全文
posted @ 2017-08-30 13:23
张伯雨
阅读(554)
推荐(0)
摘要:
package clientv3import ( pb "github.com/coreos/etcd/etcdserver/etcdserverpb" //protobuffer "golang.org/x/net/context" "google.golang.org/grpc" //google rpc 框架)type ( CompactRespon...
阅读全文
posted @ 2017-08-30 13:22
张伯雨
阅读(594)
推荐(0)
摘要:
1 配置和dbcp类似,druid的常用配置项如下配置缺省值说明name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this)jdbcUrl 连接数据库的url,不同数据库不一样。例如:mysql : jdbc:mysql://10.20.15...
阅读全文
posted @ 2017-08-30 13:15
张伯雨
阅读(673)
推荐(0)
摘要:
如果你对netty的reactor线程不了解,建议先看下上一篇文章netty源码分析之揭开reactor线程的面纱(一),这里再把reactor中的三个步骤的图贴一下reactor线程我们已经了解到netty reactor线程的第一步是轮询出注册在selector上面的IO事件(select),那么接下来就要处理这些IO事件(process selected keys),本篇文章我们将一起来探讨...
阅读全文
posted @ 2017-08-30 13:14
张伯雨
阅读(873)
推荐(0)
摘要:
来源:鸟窝,colobu.com/2016/07/14/Java-Fiber-Quasar/如有好文章投稿,请点击 → 这里了解详情最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题:服务 A 是我们开发的系统,它的业务需要调用 B、C、D 等多个服务,这些服务是通过http的访问提供的。 问题是 B、C、D 这些服务都是第三方提供的,不能保证它们的响应时间,快的话十几毫秒,慢的话甚至1秒多...
阅读全文
posted @ 2017-08-30 13:14
张伯雨
阅读(1184)
推荐(0)
摘要:
二. fastjson 解析json字符串为四种类型 1. JavaBean Person person = JSON.parseObject(jsonString, Person.class); 2. List List listPerson =JSON.parseArray(jsonString, Person.class); ...
阅读全文
posted @ 2017-08-30 13:14
张伯雨
阅读(157)
推荐(0)
摘要:
netty最核心的就是reactor线程,对应项目中使用广泛的NioEventLoop,那么NioEventLoop里面到底在干些什么事?netty是如何保证事件循环的高效轮询和任务的及时执行?又是如何来优雅地fix掉jdk的nio bug?带着这些疑问,本篇文章将庖丁解牛,带你逐步了解netty reactor线程的真相[源码基于4.1.6.Final]reactor 线程的启动NioEvent...
阅读全文
posted @ 2017-08-30 13:13
张伯雨
阅读(762)
推荐(0)
摘要:
来源:鸟窝,colobu.com/2016/03/31/vertx-thread-model/如有好文章投稿,请点击 → 这里了解详情Vert.x是一个在JVM开发reactive应用的框架,可用于开发异步、可伸缩、高并发的Web应用(虽然不限于web应用)。其目的在于为JVM提供一个Node.js的替代方案。开发者可以通过它使用JavaScript、Ruby、Groovy、Java,甚至是混合语...
阅读全文
posted @ 2017-08-30 13:12
张伯雨
阅读(5132)
推荐(0)
摘要:
来源:鸟窝,colobu.com/2015/11/17/Jax-RS-Performance-Comparison/如有好文章投稿,请点击 → 这里了解详情在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元。微服务是一个概念,并没有规定服务的格式,但是很多厂...
阅读全文
posted @ 2017-08-30 13:11
张伯雨
阅读(915)
推荐(0)
摘要:
来源:鸟窝,colobu.com/2016/07/25/understanding-rxjava-thread-model/如有好文章投稿,请点击 → 这里了解详情ReactiveX是Reactive Extensions的缩写,一般简写为Rx,最初是LINQ的一个扩展,由微软的架构师Erik Meijer领导的团队开发,在2012年11月开源,Rx是一个编程模型,目标是提供一致的编程接口,帮助开...
阅读全文
posted @ 2017-08-30 13:11
张伯雨
阅读(453)
推荐(0)
摘要:
public class AsyncDemo { private static void doSomeTask() { System.out.println("Hello World"); } private static void onCompletion() { System.out.println("All tasks finish...
阅读全文
posted @ 2017-08-30 13:10
张伯雨
阅读(1805)
推荐(0)
摘要:
大多数 JVM 具备 Java 的 HotSwap 特性,大部分开发者认为它仅仅是一个调试工具。利用这一特性,有可能在不重启 Java 进程条件下,改变 Java 方法的实现。典型的例子是使用 IDE 来编码。然而 HotSwap 可以在生产环境中实现这一功能。通过这种方式,不用停止运行程序,就可以扩展在线的应用程序,或者在运行的项目上修复小的错误。这篇文章中,我将演示动态绑定、应用运行期代码变化...
阅读全文
posted @ 2017-08-30 13:08
张伯雨
阅读(643)
推荐(0)
摘要:
因何而写网上关于bytebuffer的文章真的很多,为何在此还要写一篇呢?主要是基于以下几点考虑很多人在使用t-io时,还不会bytebuffer,只会照着t-io提供的例子照猫画虎,不利于灵活运用网上搜到的一些相关文章,讲得不是太易懂,不利于初学者灵活运用bytebuffer本文旨在讲解灵活运用bytebuffer所需的最小知识,以帮助用户快速掌握bytebuffer用极易的方式认识一下byte...
阅读全文
posted @ 2017-08-30 13:07
张伯雨
阅读(7250)
推荐(0)
摘要:
Stack Overflow 是一个大型的编程知识库。在 Stack Overflow 中已经有数以百万计的问题,并且很多答案有着很高的质量。这就是为什么 Stack Overflow 的答案经常位于 Google 搜索结果的顶部。尽管 Stack Overflow 上很多问题已经有了答案,每天还是会有很多问题被提出,很多问题仍然没有被回答或者没有获得满意的答案。那么当 Stack Overflo...
阅读全文
posted @ 2017-08-30 13:06
张伯雨
阅读(1050)
推荐(0)
摘要:
协程协程(coroutine)最早由Melvin Conway在1963年提出并实现,一句话定义:协程是用户态的轻量级的线程线程和协程线程和协程经常被放在一起比较;线程一旦被创建出来,编写者是无法决定什么时候获得或者放出时间片的,是由操作系统进行统一调度的;而协程对编写者来说是可以控制切换的时机,并且切换代价比线程小,因为不需要进行内核态的切换。协程避免了无意义的调度,由此可以提高性能,但也因此,...
阅读全文
posted @ 2017-08-30 13:05
张伯雨
阅读(272)
推荐(0)
摘要:
在此之前,有一点需要大家知道,熟悉这些原则并不是说你写出的程序就一定灵活、清晰,只是为你的优秀代码之路铺上了一层栅栏,在这些原则的指导下你才能避免陷入一些常见的代码泥沼,从而让你专心写出优秀的东西。下面我们就以Android网络框架SimpleNet为例来学习这六大面向对象的基本原则,体会这些原则在开发过程中带来的强大能量。1 单一职责原则单一职责原则的英文名称是Single Responsibi...
阅读全文
posted @ 2017-08-30 13:05
张伯雨
阅读(489)
推荐(0)
摘要:
AQS,在java.util.concurrent.locks包中,AbstractQueuedSynchronizer这个类是并发包中的核心,了解其他类之前,需要先弄清楚AQS。在JUC的很多类中都会存在一个内部类Sync,Sync都是继承自AbstractQueuedSynchronizer,相信不用说就能明白AQS有多重要。AQS原理AQS就是一个同步器,要做的事情就相当于一个锁,所以就会有...
阅读全文
posted @ 2017-08-30 13:03
张伯雨
阅读(670)
推荐(0)
摘要:
Lock框架是jdk1.5新增的,作用和synchronized的作用一样,所以学习的时候可以和synchronized做对比。在这里先和synchronized做一下简单对比,然后分析下Lock接口以及ReentrantLock的源码和说明。具体的其他的Lock实现的分析在后面会慢慢介绍。Lock框架和synchronized有关synchronized的作用和用法不在具体说明,应该都很熟悉了。...
阅读全文
posted @ 2017-08-30 13:03
张伯雨
阅读(237)
推荐(0)
摘要:
Executor框架是在Java5中引入的,可以通过该框架来控制线程的启动,执行,关闭,简化并发编程。Executor框架把任务提交和执行解耦,要执行任务的人只需要把任务描述清楚提交即可,任务的执行提交人不需要去关心。通过Executor框架来启动线程比使用Thread更好,更易管理,效率高,避免this逃逸问题。Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和...
阅读全文
posted @ 2017-08-30 13:00
张伯雨
阅读(542)
推荐(0)
摘要:
CountDownLatch是并发包中提供的一个可用于控制多个线程同时开始某动作的类,可以看做是一个计数器,计数器操作是院子操作,同时只能有一个线程去操作这个计数器。可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。CountDownLatch的一个非常典型的应用场景是:有一个任务想要往...
阅读全文
posted @ 2017-08-30 12:57
张伯雨
阅读(376)
推荐(0)
摘要:
CyclicBarrier简介CyclicBarrier和CountDownLatch不同,是当await的数量达到了设定的数量之后,才继续往下执行CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 CyclicBarrier就象它名字的意思一样,可看成是...
阅读全文
posted @ 2017-08-30 12:57
张伯雨
阅读(251)
推荐(0)
摘要:
Semaphore简介Semaphore是并发包中提供的用于控制某资源同时被访问的个数操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。Semaphore维护了当前访问的个数,提...
阅读全文
posted @ 2017-08-30 12:55
张伯雨
阅读(1072)
推荐(0)
摘要:
AtomicInteger简介支持原子操作的Integer类主要用于在高并发环境下的高效程序处理。使用非阻塞算法来实现并发控制。源码分析jdk1.7.0_71123456//在更新操作时提供“比较并替换”的作用private static final Unsafe unsafe = Unsafe.getUnsafe();//用来记录value本身在内存的偏移地址private static fin...
阅读全文
posted @ 2017-08-30 12:53
张伯雨
阅读(921)
推荐(0)
摘要:
ThreadPoolExecutor简介并发包中提供的一个线程池服务线程池的工作过程线程池刚创建,里面没有线程.任务队列是作为参数传进来的.线程池不会立即执行任务.调用execute()方法添加一个任务,线程池会做如下判断:如果正在运行的线程数量小于corePoolSize,马上创建线程运行这个任务如果正在运行的线程数量大于或等于corePoolSize,这个任务放入队列如果队列满了,且正在运行的...
阅读全文
posted @ 2017-08-30 12:53
张伯雨
阅读(268)
推荐(0)
摘要:
简介volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两种关键字来指定三种简单的存取变量的方式。12345678int i1;int geti1() {return i1;}volatile int i2;int geti2() {return i2;}int i3;synchronized int geti3() {return i3;}geti1...
阅读全文
posted @ 2017-08-30 12:52
张伯雨
阅读(220)
推荐(0)
摘要:
CopyOnWriteArrayList,写数组的拷贝,支持高效率并发且是线程安全的,读操作无锁的ArrayList。所有可变操作都是通过对底层数组进行一次新的复制来实现。CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。它不存在扩容的概念,每次写操作都要复制一个副本,在副本的基础上修改后改变Array引用。CopyOnWriteArrayList中写操作需...
阅读全文
posted @ 2017-08-30 12:49
张伯雨
阅读(2231)
推荐(0)
摘要:
ConcurrentHashMap为了高并发而设计,相比于HashTable和HashMap有更多优势。HashTable是同步的,在多线程环境下,能保证程序执行的正确性,每次同步执行的时候都要锁住整个结构。HashMap不是同步的,在单线程情况下效率高。ConcurrentHashMap锁方式是稍微细粒度的,内部采用分离锁的设计。它默认将Hash表分为16个分段,get,put,remove等常...
阅读全文
posted @ 2017-08-30 12:47
张伯雨
阅读(425)
推荐(0)
摘要:
ArrayBlockingQueue基于数组,先进先出,从尾部插入到队列,从头部开始返回。线程安全的有序阻塞队列,内部通过“互斥锁”保护竞争资源。指定时间的阻塞读写容量可限制定义ArrayBlockingQueue继承AbstractQueue,实现了BlockingQueue,Serializable接口,内部元素使用Object[]数组保存。初始化时候需要指定容量ArrayBlockingQu...
阅读全文
posted @ 2017-08-30 12:46
张伯雨
阅读(1396)
推荐(0)
摘要:
基于CopyOnWriteArrayList实现,线程安全无需集合。add调用的是CopyOnWriteArraylist的addIfAbsent方法。CopyOnWriteArraySet每次add要进行遍历数组,性能略低于CopyOnWriteArrayList。适用于set大小一般很小,读操作远远多于写操作的场景。定义CopyOnWriteArraySet集成AbstractSet,实现Se...
阅读全文
posted @ 2017-08-30 12:46
张伯雨
阅读(1091)
推荐(0)
摘要:
LinkedBlockingQueue是一个单向链表实现的阻塞队列,先进先出的顺序。支持多线程并发操作。相比于数组实现的ArrayBlockingQueue的有界,LinkedBlockingQueue可认为是无界队列。多用于任务队列。定义LinkedBlockingQueue继承AbstractQueue,实现了BlockingQueue,Serializable接口。内部使用单向链表存储数据。...
阅读全文
posted @ 2017-08-30 12:44
张伯雨
阅读(10073)
推荐(0)
摘要:
ConcurrentLinkedQueue是一个基于链表的无界线程安全队列,非阻塞实现方式,先进先出,适合高并发的场景。非阻塞的性能较好,采用CAS,避免加锁的时间,保证数据一致性。采用“wait-free”算法实现。(此部分源码看的比较吃力,很多不懂的地方,还有很多不知道的地方,希望不要误导读者,有好的文章之类的,希望能推荐下,谢谢)定义ConcurrentLinkedQueue继承Abstra...
阅读全文
posted @ 2017-08-30 12:37
张伯雨
阅读(955)
推荐(0)
摘要:
Java同步Java中同步一直都是很重要的问题,对于初学者来说也是不太容易能理解的问题。特在此记录一下有关Java中同步和锁的知识。主要涉及到同步的概念以及Java中解决的办法和简单的例子。有关锁Lock中的内容不在此做说明。同步为什么需要同步这个问题不难回答。当牵扯到同步问题的时候,就离不开多线程了。简单举个例子,桌子上有一台2016新款MacBook pro,我和女朋友都想要去玩,我们俩同时伸...
阅读全文
posted @ 2017-08-30 12:36
张伯雨
阅读(297)
推荐(0)
摘要:
Java多线程简介Java中内置了对多线程的支持,让多线程的开发方便很多,但同时也带来了另外的复杂,线程间的交互以及很多的不确定性让多线程又显得很复杂。在此只是针对Java中多线程的基础做些说明,有关线程和进程的区别,以及多线程的好处和更深层的暂不多说。线程的状态线程的状态定义在Thread类中一个State枚举类型:新建状态(NEW),通过new Thread新建的线程处于新建状态,通常会调用s...
阅读全文
posted @ 2017-08-30 12:36
张伯雨
阅读(173)
推荐(0)
摘要:
实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。因此,在比较两个枚举类型的值时,永远不需要调用equals方法,而直接使用"=="就可以了。(equals()方法也是直接使用==, 两者是一样的效果)Java Enum类型的语法结构尽管和Java类的语法不一样,应该说差别比较大。但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际...
阅读全文
posted @ 2017-08-30 12:35
张伯雨
阅读(1659)
推荐(0)
摘要:
使用JRebel启动工程时加上VM参数时有一个参数是"-javaagent:D:\jrebel_5.6.0\jrebel.jar"。javaagent是什么? java -help后看到如下信息: Java代理不是应用程序中的一部分,instrument支持Java以代理的形式监控或重新定义运行中的服务。我们可以在不修改程序代码的前提下通过Instrumentation API改变运行中的java...
阅读全文
posted @ 2017-08-30 12:34
张伯雨
阅读(1593)
推荐(0)
摘要:
摘要: Instrumentation 类加载过程 Instrumentation与Transformer Instrumentation与Transformer的关系 Instrumentation接口简介 触发字节码转换的途径 Transformer分类 Transformer调度过程...Instrumentation 类加载过程 Instrumentation与Transfo...
阅读全文
posted @ 2017-08-30 12:34
张伯雨
阅读(986)
推荐(0)
摘要:
Instrumentation介绍:Java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态,替换和修改类定义等。 Java SE5中使用JVM TI替代了JVM PI和JVM DI。提供一套代理机制,支持独立于JVM应用程序之外的程序以代理的方式连接和访问JVM。Instru...
阅读全文
posted @ 2017-08-30 12:32
张伯雨
阅读(796)
推荐(0)
摘要:
学习了instrument之后试着自己写点东西,上一篇的例子中使用的是asm,毕竟是面向字节码的,api还是比较复杂的。其实有时候的需求很简单,无非就是看下类里的方法啊之类的。javassist是基于源码级别的API比基于字节码的ASM简单。下面就是对使用到的类打印出所有方法的Transformer:[java] view plain copypublic class TestTransforme...
阅读全文
posted @ 2017-08-30 12:32
张伯雨
阅读(297)
推荐(0)
摘要:
Dubbo中关于服务的订阅和通知主要发生在服务提供方暴露服务的过程和服务消费方初始化时候引用服务的过程中。服务引用过程中的订阅和通知在服务消费者初始化的过程中,会有一步是进行服务的引用,具体的代码是在RegistryProtocol的refer方法:12345678910111213141516171819public Invoker refer(Class type, URL url) thr...
阅读全文
posted @ 2017-08-30 12:05
张伯雨
阅读(601)
推荐(0)
摘要:
Directory代表多个Invoker,可以把它看成List,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更。Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。上面是文档上对Directory的解释。Directory接口Directory接口继承了Node接口:1234567publ...
阅读全文
posted @ 2017-08-30 12:04
张伯雨
阅读(1011)
推荐(0)
摘要:
Dubbo中的Cluster可以将多个服务提供方伪装成一个提供方,具体也就是将Directory中的多个Invoker伪装成一个Invoker,在伪装的过程中包含了容错的处理,负载均衡的处理和路由的处理。这篇文章介绍下集群相关的东西,开始先对着文档解释下容错模式,负载均衡,路由等概念,然后解析下源码的处理。(稍微有点乱,心情不太好,不适合分析源码。)集群的容错模式Failover Cluster这...
阅读全文
posted @ 2017-08-30 12:03
张伯雨
阅读(461)
推荐(0)
摘要:
服务提供者初始化完成之后,对外暴露Exporter。服务消费者初始化完成之后,得到的是Proxy代理,方法调用的时候就是调用代理。服务消费者经过初始化之后,得到的是一个动态代理类,InvokerInvocationHandler,包含MockClusterInvoker,MockClusterInvoker包含一个RegistryDirectory和FailoverClusterInvoker。J...
阅读全文
posted @ 2017-08-30 12:02
张伯雨
阅读(751)
推荐(0)
摘要:
首先还是Spring碰到dubbo的标签之后,会使用parseCustomElement解析dubbo标签,使用的解析器是dubbo的DubboBeanDefinitionParser,解析完成之后返回BeanDefinition给Spring管理。服务消费者端对应的是ReferenceBean,实现了ApplicationContextAware接口,Spring会在Bean的实例化那一步回调s...
阅读全文
posted @ 2017-08-30 12:00
张伯雨
阅读(2747)
推荐(0)
摘要:
(这里做的解析不是很详细,等到走完整个流程再来解析)Dubbo中编解码的工作由Codec2接口的实现来处理,回想一下第一次接触到Codec2相关的内容是在服务端暴露服务的时候,根据具体的协议去暴露服务的步骤中,在DubboProtocol的createServer方法中:1234567891011private ExchangeServer createServer(URL url) { 。。。 ...
阅读全文
posted @ 2017-08-30 11:59
张伯雨
阅读(777)
推荐(0)
摘要:
dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay=”5000”),另外一种是没有设置延迟暴露或者延迟设置为-1(delay=”-1”):设置了延迟暴露,dubbo在Spring实例化bean(initializeBean)的时候会对实现了InitializingBean的类进行回调,回调方法是afterPropertySet(),如果设置了延迟暴露,dubbo在这个方法中进行服务...
阅读全文
posted @ 2017-08-30 11:58
张伯雨
阅读(847)
推荐(0)
摘要:
dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源。dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name,可以通过name找到具体的实现。每个扩展点都有一个@Adaptive实例,用来注入到依赖这个扩展点的某些类中,运行时通过url参数去动态判断最终选择哪个Extension实例用。dubbo的SPI扩展机...
阅读全文
posted @ 2017-08-30 11:55
张伯雨
阅读(313)
推荐(0)
摘要:
一、go语言中使用C语言go代码中使用C代码,在go语言的函数块中,以注释的方式写入C代码,然后紧跟import “C” 即可在go代码中使用C函数代码示例:go代码:testC.go1234567891011121314151617181 package main 2 3 /* 4 #include 5 #include 6 void c_print(char *str) { 7 p...
阅读全文
posted @ 2017-08-30 11:26
张伯雨
阅读(1616)
推荐(0)
摘要:
Elasticsearch笔记九之优化优化从索引片段,内存设置,副本,分片,日志等方面入手。1:索引片段Es运行时会生成很多索引片段,执行查询时会打开这些索引片断。系统会限制打开索引片断的个数一旦超过这个个数限制就无法打开索引片断。我们可以通过命令来查看更改索引片断的限制数量。索引片断位置/usr/local/elasticsearch-1.4.4/data/elasticsearch/nodes...
阅读全文
posted @ 2017-08-30 11:12
张伯雨
阅读(754)
推荐(0)
摘要:
Elasticsearch笔记八之脑裂概述: 一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息。 而脑裂问题的出现就是因为从节点在选择主节点上出现分歧导致一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。 一般es集群会在内网部署,也可能在外网部署比如阿里云。原因:1:网络原因内网一般不会出...
阅读全文
posted @ 2017-08-30 11:02
张伯雨
阅读(505)
推荐(0)
摘要:
Elasticsearch笔记七之setting,mapping,分片查询方式setting通过setting可以更改es配置可以用来修改副本数和分片数。1:查看,通过curl或浏览器可以看到副本分片信息curl -XGET http://192.168.79.131:9200/shb01/_settings?prettyhttp://192.168.79.131:9200/shb01/_sett...
阅读全文
posted @ 2017-08-30 10:53
张伯雨
阅读(5309)
推荐(0)
摘要:
中文分词器在lunix下执行下列命令,可以看到本来应该按照中文”北京大学”来查询结果es将其分拆为”北”,”京”,”大”,”学”四个汉字,这显然不符合我的预期。这是因为Es默认的是英文分词器我需要为其配置中文分词器。curlHTTP://192.168.79.131:9200/shb01/_analyze?pretty=true -d'{"text":"北京大学"}'Es整合ik不直接用ik官网的...
阅读全文
posted @ 2017-08-30 10:52
张伯雨
阅读(4173)
推荐(0)
摘要:
在es根目录下有一个config目录,在此目录下有两个文件分别是elasticsearch.yml和logging.yml。 logging.yml是日志文件,es也是使用log4j来记录日志的,我在此文件中配置日志级别。 elasticsearch.yml是es的基本配置文件es的参数都在这个文件中,我们这里结合此文件来介绍es的核心概念和参数。1:集群 nod...
阅读全文
posted @ 2017-08-30 10:51
张伯雨
阅读(597)
推荐(0)
摘要:
Elasticsearch笔记二之Curl工具基本操作简介:Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式。-X指定http请求的方法,-d指定要传输的数据。创建索引:Put创建curl -XPUThttp://localhost:9200/shb01/student/1-d'{"name":"jack","age":30,"info":"Ilove you"}'{"...
阅读全文
posted @ 2017-08-30 10:50
张伯雨
阅读(1679)
推荐(0)
摘要:
版本控制1:关系型数据库使用的是悲观锁,数据被读取后就被锁定其他的线程就无法对其进行修改。2:ex使用的是乐观锁,数据被读取后其他程序还可以对其进行修改,而执行修改时发现此数据已经被修改则修改就会失败,之后则由程序对此进行下一步处理。 先通过-XGETD得到数据的版本号version 然后在-XPUT时将版本号作为参数传递过去,比对版本号与当前数据的版本号是否一致,一直则修改不一致报错。 ...
阅读全文
posted @ 2017-08-30 10:50
张伯雨
阅读(271)
推荐(0)
摘要:
Java操作es集群步骤1:配置集群对象信息;2:创建客户端;3:查看集群信息1:集群名称 默认集群名为elasticsearch,如果集群名称和指定的不一致则在使用节点资源时会报错。2:嗅探功能 通过client.transport.sniff启动嗅探功能,这样只需要指定集群中的某一个节点(不一定是主节点),然后会加载集群中的其他节点,这样只要程序不停即使此节点宕机仍然可以...
阅读全文
posted @ 2017-08-30 10:49
张伯雨
阅读(9277)
推荐(0)
摘要:
前言开源实时日志分析ELK平台(ElasticSearch, Logstash, Kibana组成),能很方便的帮我们收集日志,进行集中化的管理,并且能很方便的进行日志的统计和检索,下面基于ELK的最新版本5.1进行一次整合测试。ElasticSearch1.概述:ElasticSearch是一个高可扩展的开源的全文搜索分析引擎。它允许你快速的存储、搜索和分析大量数据。ElasticSearch通...
阅读全文
posted @ 2017-08-30 10:42
张伯雨
阅读(389)
推荐(0)
摘要:
package acl import ( "github.com/armon/go-radix" ) var ( // allowAll is a singleton policy which allows all // non-management actions allowAll ACL //
阅读全文
posted @ 2017-08-30 10:38
张伯雨
阅读(266)
推荐(0)