Java
# 基础 1. 谈谈深拷贝和浅拷贝 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。 在 Object 类中,有个 clone() 方法,默认的就是浅拷贝,一个类想要重写 clone() 函数,需要实现 Cloneable 接口,自己实现深拷贝,就可以在 clone 函数中直接 new 就行。序列化也是深拷贝,这里直接给代码: class DeepClone implements Serializable { private static...
more...计算机网络
本文积累了作者在准备面试时学习的计算机网络的知识与问题,作为科班出身,408 这些科目的重要性不必多说,能直接检验出你作为科班选手的水准。 1. 键入网址后依次发生了什么? 参考链接:https://mp.weixin.qq.com/s/I6BLwbIpfGEJnxjDcPXc1A 浏览器解析 URL 生成 Http 请求。 发送 Http 请求前,会将域名解析为 IP 地址,会先查询浏览器缓存、系统缓存、本机 hosts 文件,如果没有,就会发送请求到本地域名服务器,通过本地域名服务器分别访问根域名服务器、顶级域名服务器、权威域名服务器,最终拿到域名映射的 IP...
more...JUC-原子类B(atomic包)
java.util.concurrent.atomic 包,提供了很多原子操作类,这些类基本上都是使用 Unsafe 实现的包装类。 注意是包装类,类属性有: value , value 的地址偏移量等。 # 原子更新基本类型 atomic 包提供 boolean , int , long 的原子更新操作。以 AtomicInteger 为例讲解,常用方法为: addAndGet(int delta) :原子相加 compareAndSet(int except, int update) : cas 操作 getAndIncrement() :原子自增 lazySet(int...
more...JUC-原子类A(CAS与Unsafe)
# CAS 我们希望在并发的过程中,先进行操作,如果没有其他线程争用共享数据,那么操作就成功了,否则就采取补偿措施。这种基于冲突检测的乐观的操作许多实现都不需要将线程阻塞,因此这种同步操作称为非阻塞同步。 乐观锁需要操作和冲突检测这两个步骤具备原子性,这里的原子性不能够使用互斥同步来保证,只能靠硬件来完成。硬件支持的原子性操作最典型的是: 比较并交换 ( Compare-and-Swap,CAS )。 CAS 指令需要有 3 个操作数,分别是内存地址 V 、旧的预期值 A 和新值 B 。当执行操作时,只有当 V 的值等于 A ,才将 V 的值更新为 B 。 因为 CAS...
more...JUC-线程池E(Fork/Join)
# Fork/Join 框架 本文不会对源码部分涉及太多,主要是讲几个小例子来演示如何使用。 Fork/Join 框架是 Java 并发工具包中的一种可以将一个大任务拆分为很多小任务来异步执行的工具,该技术就是分治算法的并行实现,自 JDK1.7 引入。 该框架主要包含三个模块: 任务对象: ForkJoinTask 执行 Fork/Join 任务的线程: ForkJoinWorkerThread 线程池: ForkJoinPool 三者关系: ForkJoinPool 可以通过池中的 ForkJoinWorkerThread 来处理 ForkJoinTask...
more...JUC-线程池D(ScheduledThreadPoolExecutor)
# 类结构 线程池也可以执行定时任务,以前如果要执行一个定时任务,需要用到 Timer 和 TimerTask ,但是它只是创建一个线程执行定时任务,无法多线程调度。 JDK1.5 之后可以使用 ScheduledThreadPoolExecutor : public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService {}该类所有构造方法都要求线程池最大容量为 Integer.MAX_VALUE ,并且均采用...
more...JUC-线程池C(ThreadPoolExecutor)
# 工具类 Executors 注意区别 Executor 类和 ExcetorService ,前者提供的是显式地创建线程运行提交过来的任务, ExecutorService 继承了 Executor ,多提供了管理终止方法和生成 Future 方法。但是创建出来的线程交给谁去运行的呢?接口只是规定了行为,而不会去管实现。 还是先看一下相关的类结构: Executors 就实现了创建线程池的操作(真的是 Executors 实现的吗?),通过 Executors 可以创建一些特定的线程池: Executors.newCachedThreadPool()...
more...