二、开放式问题

解释什么是流(streaming)和如何实现一个流?

  • 解释

    • 这里注意一下这个概念是Stream,而不是Flow,Flow一般常见于网络流(Network Flow)。两者中文翻译都是“流”,但概念不同

    • 根据维基百科,流的一般概念是一个包含资料的序列,理论上具有无限、一个接一个(“个”可以是一个字节,一个bit等各种基本数据单元)的特质,区别于将资料包作一整个来进行处理的输送带

    • 在计算机里是顺序读取或写入的字节序列,能统一描述所有常见输入输出类型的模型,而统一描述之后,相同的程序就可以通过输入输出重定向来处理不同的对象(多态思想)。原本基于分组交换的网络IO在经典的TCP协议设计出来后,大部分也都能用流的模型来描述

    • 能体现出流的经典的几种常见应用概念包括过滤器(filters)、重定向(redirect)管道(pipeline)以及懒加载(lazy loading)等

  • 实现

    • 一个流实现需要包含容器、来源以及数据等
    • 对外暴露接口

在你当前的工作流中,什么事情是你计划下一步需要自动化的?

  • 我们有一个产品的功能是发送消息,消息发送设置项多且复杂,目前开发过程中都是手动在点击设置发送,频繁重复同样的操作非常浪费时间,希望一个脚本启动就能设置完所有然后发送

  • 初步设想的技术栈是 Python+PhantomJS+Selenium 模拟点击过程,以win下exe的形式运行,如果选项className或idName有规律可以考虑做成命令行形式?

  • 缺点是根据之前使用的经验selenium控制不好有一定的崩溃几率,暂时不知道解决方式


三、设计模式相关问题

假设你工作的系统不支持事务性,你会如何从头开始实现它?

  • 事务性本质上可以认为是原子操作的进一步原子封装,因此实现的关键还是在于系统当前拥有的原子操作级别(理论上最基础至少在Linux支持基本C的相关库),需要封装的原子操作级别(例如:参考MySQL的数据库事务级别包括Read Uncommitted、Read Committed、Repeatable Read、Serializable等)

  • 从事务角度来说若要保证最强一致性,当然可以把数据都锁起来,但这样势必会严重影响并发性能。而除了一致性强度要求问题,还有另一个考量是分段锁数据,这就对锁的类型、范围有要求

  • 首先一个最基本的锁单元实现方式:(具体代码见代码小全的锁实现),实现了一个基本的锁模块,就可以针对几种常见事务问题来进一步升级锁(例如:解决脏读,不可重复读,幻读等),参考InnoDB引擎,解决幻读可以使用区间锁,锁住一部分行范围,不允许其中插入新的数据,在此期间,其它冲突事务会被阻塞

  • 涉及重要概念:读、写、计算、一致性、锁、原子操作、数据分段锁

写一个线程安全的单例类

  • 此处使用java代码作为实例

  • 懒汉式(线程安全,低效率

public class Singleton {
    private volatile static Singleton instance;
    public static synchronized Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
            //这一句并不是一个原子操作,因此需要volatile禁止重排序
        }
        return instance;
    }
}

instance = new Singleton();这一句在内存中有一个指令顺序问题*:1.分配内存。2.调用构造函数给instance初始化。3.instance对象指向分配的内存空间。*若顺序为132的话,2之前instance已经非空了但并没有初始化完成,被别的线程抢占,就会直接返回未初始化完成的对象引用导致报错

  • 饿汉式(饥饿,请求前初始化,非懒加载
public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance() {
        return instance;
    }
}
  • 双重检验锁
public class Singleton {
    private static Singleton instance;
    public static Singleton getInstance() {
        if(instance == null) {
            synchronized (Singleton.class) {
                if(instance == null) instance = new Singleton();
            }
        }
        return instance;
    }
}
  • 静态内部类(懒加载)
public class Singleton {
    private static class SingleHolder {
        private static final SingleHolder instance = new SingleHolder();
    }
    private Singleton(){}
    public static SingleHolder getInstance() {
        return SingleHolder.instance;
        //由于instance是静态内部类的静态成员,虽然是私有的也可以直接访问?
    }
}
  • 枚举(创建枚举默认就是线程安全的)(最优
public enum EasySingleton{
    INSTANCE;
}
EasySingleton.INSTANCE

Written with StackEdit.