状态机应用实践

Bob最近找了一份搬砖的工作,每次会搬数量不等的砖,一天结束后包工头Alice会为其结算工资。一开始工人不多的时候,包工头自己用笔记录就能搞清楚每天该给每个工人结算多少工资。后面Alice的业务推广到全国,单靠人工就没法支持业务的发展了,急需一套信息化系统来支撑,于是我们开干。

Read More ...

如何保证幂等性

什么是幂等性

想象一下这样的场景,用户在商城下单买东西,然后发起支付,钱已经扣成功了,但是由于网络超时或其它一些原因导致商城未能正常得到支付结果。用户又重新发起支付,如果支付服务没有幂等性保证,就会导致重复扣款,对用户来说就是极差的体验。

通用的讲,服务在处理一条数据请求时,根据具体的业务场景判断,如果同一条数据请求 有且仅能被处理一次,那么就需要对这条数据请求的处理保证幂等性,避免重复处理。

Read More ...

Java线程状态

Java线程状态机

Read More ...

Java如何保证线程安全

当多个线程并发的读写相同的数据,可能出现数据错误,从而导致线程安全问题。

public class Main {

    private int count = 0;

    public void increase() {
        this.count++;
    }

    public int getCount() {
        return this.count;
    }

}

如上代码,如果多个线程并发的调用 increase 方法,就可能引起线程安全问题。

Read More ...

Java线程池原理及应用实践

为什么要使用线程池

在多任务并发的场景,如同时处理多个用户的请求,通常会使用多线程的方式进行,提供一种伪并行的能力。线程本身作为一种资源(操作系统调度的最小单位),其创建、销毁的过程相对来说都比较重量级,而且会有一定的时间消耗。如果提前将线程创建好,当任务到达后就可以直接执行(前提是线程池空闲);执行完成后不立即销毁线程,继续执行下一个任务或者等待新任务的到达。所以利用线程次即可以消除线程创建的等待时间,避免线程频繁创建、销毁所带来的资源损耗。

线程本身作为一种资源也不是无限的,当需要并发处理的任务超过系统极限时,继续创建线程已不可能,那么可行的策略就是拒绝执行任务、或者让任务排队等待,直到有空闲的线程来执行为止。而要解决这些问题,都是比较复杂、繁琐的,线程池则可以统一进行实现、封装。

Read More ...