我们常常使用channel来在多个goroutine之间做数据通讯,但是我们还想要控制接口方法chan的数据进出方向,但是chan作为方法的入参我们应该怎么写呢?也许有人觉得这个问题比较傻,不过这个还真的是我今天才知道的.
首先我们看看下面的代码:
|
|
我们常常使用channel来在多个goroutine之间做数据通讯,但是我们还想要控制接口方法chan的数据进出方向,但是chan作为方法的入参我们应该怎么写呢?也许有人觉得这个问题比较傻,不过这个还真的是我今天才知道的.
首先我们看看下面的代码:
|
|
最近近在看java里面ThreadLocal里面对于ThreadMap的查找使用的是Hash算法,还提到了神奇数字,于是深入的看了hash这个东西,下面就来掰扯一下hash的原理,搞懂原理了,其实对于hashmap或者hashset这种类也就很好理解,无非就是算法选择的不同而已.
首先一个问题:hash是什么?
其实hash应该叫哈希函数,就是从给定的一个key开始,根据一定的算法来计算出一个唯一值即:f(Key)=hashCode,要求是通过f的函数计算后key和这个hash值是保持一对一的唯一关系.很多地方说适用于寻址,这也是用法之一,像MD5这种摘要算法就是仅仅用于校验的.
今天想外置logback.xml,写了如下代码
我们经常把spring需要加载的properties文件放在java/resources下面,这样存放的问题导致properties在打包后就在jar的根目录下,所以我们的spring的配置路径就是classpath*:xxx.properties,但是这样的jar我们在被其他项目引用的时候会发现properties文件老是无法加载,就这个问题从spring的源码来找找为什么会这样.
首先properties是当做一个resource来加载的,实现加载的是org.springframework.core.io.ResourceLoader
接口的一个实现,其中org.springframework.core.io.support.PathMatchingResourcePatternResolver
用于解析classpath*:为前缀的资源定义.
PathMatchingResourcePatternResolver的getResources方法里面有以下内容
GC的目的就是把不用的对象清理出内存,然后我们在java里面用到的对象其实都是引用,其实就是对象的指针(虽然java里面没有指针的概念,但是引用其实就是指针了),在GC的时候就是每种引用的回收策略下面来一一说明.
java里面的引用有四中,强引用Final Reference,弱引用Weak Reference,软引用Soft Reference,影子引用Phantom Reference.
先说强引用,有三个特征:(String a = new String(“a”))
>
Volatile在一般的多线程编程里面算是比较尴尬的关键字,在java里面叫做程度较轻的 synchronized
,不过一般在一些多线程的文章里面几乎不提到Volatile或者不建议使用这个关键字,毕竟这个关键字非常不好控制,干脆不用为好,我的看法是大多是时候么搞不清楚就不要用,(当然越不用就越生疏,呵呵),但是话说回来我对这个关键字实现高性能读写锁还是比较感兴趣的
首先总结一下Volatile的特性:
最近面试中被问到sleep与wait的差别,虽然都是说sleep不释放资源,wait释放资源,但是不是眼见为实的话又怎么理解这个释放资源的意思呢,所以谢了一段很简单的代码来演示一下,废话少说,上代码先:
有人觉得堵塞就是同步,非堵塞就是异步,其实以前我也是这么想的,其实同步与堵塞这完全是两码事,所以写篇文章来说说为什么是两码事,也顺便说说各种组合的可以达到的效果,帮助大家了解底层的原理.
首先需要了解这些概念,OS里面有内核态和用户态两种,程序进行IO操作的时候一般是两步,第一步是IO初始化也就是准备好IO操作,第二步就是真正的IO操作.其中第一步决定同步还是异步,第二步决定堵塞还是非堵塞的,为什么这么说呢,我们以Linux为例来看看这个关键字的组合
今天有个小弟问我进程线程的问题,给他解释的时候发现还是有点东西可以讲的,所以写下来,让没有弄清楚的人也通过的我看这东西的角度去理解这些编程时候遇到的概念.
进程
由OS来管理,每个进程都有自己独立的内存空间,进程之间通讯主要是通过信号传递的方式来实现的,实现方式有多种,信号量,管道,事件等,任何一种方式的通讯效率都需要过内核,导致通讯效率比较低.由于是独立的内存空间,所以上下文切换的时候需要保存当先调用栈的信息,cpu各寄存器的信息,虚拟内存,以及打开的相关句柄等信息,所以导致上下文切换的代价非常高,因此进程并不适合大量创建.
我们现在用maven来开发,引入的第三方包依赖的日志框架有log4j的,有commons.logging的还有一些是用的java.util.logging,其他的日志框架暂时先不考虑,我们就说说在一个项目里面如何统一化这些日志框架.
首先说到logback的话就一定要提到SLF4J,这个项目主要目的是提供一个统一的日志接口,当然如果你有那个闲工夫你也可以写一个统一的日志接口来玩玩,如: