java.util.concurrent.locks.ReentrantLock
提供了比synchronized提供更灵活的锁,可以设置为公平锁,非公平锁,能够带超时时间获取公平锁等等。
synchronized
Java默认提供,由JVM提供。但是因为JVM的黑盒子特性,锁特性会在运行中发生变化。
具体可以翻阅一下这篇文章
java.util.concurrent.locks.ReentrantLock
提供了比synchronized提供更灵活的锁,可以设置为公平锁,非公平锁,能够带超时时间获取公平锁等等。
synchronized
Java默认提供,由JVM提供。但是因为JVM的黑盒子特性,锁特性会在运行中发生变化。
具体可以翻阅一下这篇文章
简单而言就是JVM提供了一个钩子,能在JVM接受到关闭的信号量时候start一个线程,然后做一些清理工作,避免产生脏数据
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run()
{
scheduledExecutorService.shutdown();
}
});
ApplicationContext:
这是一个标准的Spring程序的入口,用来加载上下文其实现类是:AbstractApplicationContext:
这里实现了对Spring上下文的生命周期的管理
AbstractXmlApplicationContext
解析xml使之成为Spring的上下文
ClassPathXmlApplicationContext,FileSystemXmlApplicationContext
寻找到具体的xml所在的磁盘或者classpath所在的位置
一致性(Consistency):
分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(Availability):
集群出现故障节点后,是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(Partition tolerance) :
实际中通信产生延时。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C点和A点之间做出选择。
分成这些样子之外还要对同等级之间的相互访问进行限制,不同等级之间的尽可能在设计上就不要相互影响
# PCMonitor
为什么要这么构造包结构:
1) 同目录之间的包应该是同级的
2) class应该调用子包和同级目录中的class
3) 给予上级目录调用的等同于对外提供方法的应该提供Interface
4) 包与包之间之间除了Interface的接口其他不可互相调用
5) 不是包外可见的方法不要增加public关键字
关于巨大的Utils类这种存在,我们可以在包的根部写一个Abstract的Utils,然后每个包中写一个Utils并继承根包下的Utils(等效于只应该调用包内的class),如果有多个包共同调用的方法可以新建一个abstract表述清楚是哪几个package要调用,并继承根目录下的Utils,同时在包内的Util继承你刚编写的abstract Utils。
Junit编写说明:
1) 每一个method编写一个Test
2) 只关注Method的输入输出
3) public方法直接调用
private方法用反射调用
4)保持整个编码过程中,Junit测试的正确性
每个package就是一个subsystem,一个subsystem应该只实现一个功能。
最简单的,KMP算法用自动状态机解释比用next数组解释要清晰且容易理解。