基于Docker的代码质量持续约束流程搭建
为了提高团队整体的代码质量,有必要搭建一套持续的代码约束流程。本文记录基于Docker如何搭建自动化代码检测流程
记录在Docker上创建单broker的Kafka过程
1 | docker network create -d bridge --subnet=10.0.0.0/24 kafka_net |
1 | docker run --restart=always -d -ti --name zookeeperService --network=kafka_net -p 2181:2181 -v /home/core/zookeeper/conf:/conf -v /home/core/zookeeper/data:/data -v /home/core/zookeeper/dataLog:/dataLog zookeeper |
1 | docker run --rm -it --network=host zookeeper zkCli.sh -server localhost:2181 |
记录下多线程情况下,如何避免资源竞争带来的问题
多线程在运行期间,若存在数据的共享,不同线程对资源的争抢会造成彼方线程的处理错乱。下面是两个线程将数值从零累加10次的例子(预计结果为10)
1 | class Count implements Runnable { |
当线程或进程依赖某一资源(代码中的countResult),会发生资源竞争。使针对资源的操作互斥,能够解决资源竞争带来的结果不可预测
记录下Java中多线程的使用
记录下并发与多线程的一些知识
多核CPU与缓存
记录下Git如何与IntelliJ IDEA协作
http://8lovelife.com:1017
1 | Mac:code mac$ git clone https://github.com/grpc/grpc-java.git |
1 | Mac:dmz-inward- mac$ git branch -av |
线程间的通信方式有:共享内存和消息传递
多个线程通过读写内存中的共享对象来隐式的进行通信。如Java中的对象
线程间通过发送消息显示的进行通信。如Java中的wait()/notify()
线程间共享的对象都在主存中,每个线程都会有一块私有的本地内存称为栈,线程栈中存储了共享对象的副本
线程安全包括几个方面的内容:1。原子性 2。可见性 3。有序性
原子性提供了多线程间代码指令的互斥访问。如:Synchronized、Lock
一个线程对共享内存数据的修改是否会立刻被其他线程感知到?多线程间的共享数据访问会由于缓存的不一致性导致数据错乱
记录下单例模式的几种实现
单例类保证在系统中始终只有一份类的实例,单例模式能够节约内存空间,对于整个系统中共性的逻辑可以采用单例模式。分布式系统中ZK就像是整个系统中的”单例”
单例的实现方式有多种,根据实例化时机可分为饿汉、懒汉模式
1 | public class Singleton { |
单例在类的加载时就完成了类的实例(即使这个类还没被使用)
回顾回顾JVM中的类加载
类的生命周期包括类的加载、链接、初始化、使用、销毁
将类装入JVM供使用的过程分为:类的加载、链接、初始化
类的加载包括
这一阶段类对象仅有基本的内存结构,类对象中的方法、字段、引用都不做处理,此时的类还不能使用
类的链接将内存中二进制数据转换到JVM运行数据区,链接包括验证、准备、解析
1 | final static int a = 10 准备阶段阶段 a 的默认值为 10 |