Java中的锁

java.util.concurrent.locks.ReentrantLock

提供了比synchronized提供更灵活的锁,可以设置为公平锁,非公平锁,能够带超时时间获取公平锁等等。
synchronized

Java默认提供,由JVM提供。但是因为JVM的黑盒子特性,锁特性会在运行中发生变化。

具体可以翻阅一下这篇文章

synchronized、锁、多线程同步的原理是咋样的

两种锁的性能测试结果

Java的优雅退出

简单而言就是JVM提供了一个钩子,能在JVM接受到关闭的信号量时候start一个线程,然后做一些清理工作,避免产生脏数据

        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run()
            {
                scheduledExecutorService.shutdown();
            }
        });

 

字符串左移N位

第一种,简洁算法

根据矩阵运算中的\left(AB\right)^{\mathrm {T} }=B^{\mathrm {T} }A^{\mathrm {T} }可得

package com.liangyumingblog;

public class RollUpString
{
    private String string;

    public RollUpString(String s)
    {
        this.string = s;
    }

    public String rollup(int n)
    {
        StringBuilder s1 = new StringBuilder(string.substring(0, n));
        StringBuilder s2 = new StringBuilder(string.substring(n + 1));
        return s1.reverse().append(s2.reverse().toString()).reverse().toString();
    }
}

继续阅读“字符串左移N位”

Spring解析xml

ApplicationContext:

这是一个标准的Spring程序的入口,用来加载上下文其实现类是:AbstractApplicationContext:

这里实现了对Spring上下文的生命周期的管理

AbstractXmlApplicationContext

解析xml使之成为Spring的上下文

ClassPathXmlApplicationContext,FileSystemXmlApplicationContext

寻找到具体的xml所在的磁盘或者classpath所在的位置

分布式系统CAP原理

  • 一致性(Consistency):

    分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

  • 可用性(Availability)

    集群出现故障节点后,是否还能响应客户端的读写请求。(对数据更新具备高可用性)

  • 分区容忍性(Partition tolerance)

    实际中通信产生延时。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C点和A点之间做出选择。

如何建造一个系统(迭代方式)

  1. 拿到一个问题(需求),先通过分析做一个简单的模型;
  2. 将简单的模型详细化(按照软件设计层级),但不需要多漂亮,达到能完成功能即可;
  3. 按照设计快速实现一遍;
  4. 按照使用者的角度使用一遍,提出一堆需求,然后重构,然后回到步骤2,直到软件结构能够较为清晰(最高目标当然是代码及目录结构可以自解释)

软件设计层级

  1. 先从整个软件系统的用途思考
  2. 分解软件系统为一个一个的package,并且package是如何交互的
  3. 接着分解成类,每个类要有明确的交互对象
  4. 分解成子程序(Function)
  5. 最后才是实际运行的代码

分成这些样子之外还要对同等级之间的相互访问进行限制,不同等级之间的尽可能在设计上就不要相互影响