随笔分类 - 技术
摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 多数码农在开发的时候,要么处理同步应用,要么处理异步。但是如果能学会使用CompletableFuture,就会具备一种神奇的能力:将同步变为异步(有点像用了月光宝盒后同时穿梭在好几个时空的感觉)。怎么做呢?来看看代码。 新增一个商店类Shop
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 在《计算机干活的两种方式》中我们提到过同步和异步的区别。所谓同步就是事情只能一件接一件地顺着干,而不能跳过。比如外卖小哥送外卖只能一件一件地送,不能说一件先送一半再送另一件。而异步就可以不按顺序出牌,但是这种不按顺序需要以互不影响为前提。比如李
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 从之前的Lambda表达式的演变过程可以知道,Lambda表达式其实是一个对匿名内部类的简化过程:去掉了多余的语法修饰,只保留最最核心的部分。在Java中类似这种使用匿名内部类写代码的场景非常多,比如Runnable接口,就是典型的最好使用La
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ Java在其技术发展周期中经历过几次比较重要的变化,如果不是这几次比较重要的变化,恐怕不会有现在这样的江湖地位。个人看来,至少有两次,一是2010~2011年兴起的移动应用开发,Android的出现,让Java狠狠地出了次风头。再就是2014年
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 除了四种常见的同步器(发令枪、摇号器、栅栏和交换机),JUC还有所谓线程安全的容器、阻塞队列和一些特殊的类。其中常出现的就是线程安全的容器和阻塞队列。与其说这是两个大的分类,还不如说它就是两个用得最多的类:ConcurrentHashMap和A
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 前面把线程相关的生命周期、关键字、线程池(ThreadPool)、ThreadLocal、CAS、锁和AQS都讲完了,现在就剩下怎么来用多线程了。而要想用好多线程,其实是可以取一些巧的,比如JUC(好多面试官喜欢问的JUC,就是现在要讲的JUC
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 之前说过,AQS(抽象队列同步器)是Java锁机制的底层实现。既然它这么优秀,是骡子是马,就拉出来溜溜吧。 首先用重入锁来实现简单的累加,就像这样: /** * 用重入锁实现累加 * * @author 湘王 */ public class M
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ Java中的AQS(AbstractQueuedSynchronizer,抽象队列同步器)是用来实现锁及其他同步功能组件的Java底层技术基础,java.util.concurrent包下大部分类的实现都离不开它。 通过继承AQS: 1、Ree
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 在Java面试中,有一类高频问题会经常问到(火箭式问题):Java有几种锁?都是干嘛的?我想对于面试经验较为丰富的人,这个问题极有可能遇到过。不过我估计除了「死锁」大部分人都听过以外,其他的什么锁可能就不是那么清楚了。实际上,Java总共有6大
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 在JDK1.5之前,Java的多线程都是靠synchronized来保证同步的,这会引起很多性能问题,例如死锁。但随着Java的不断完善,JNI(Java Native Interface)使得Java能越过JVM直接调用本地方法,例如CAS。
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 为了提高CPU的利用率,工程师们创造了多线程。但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们又接着创造了线程池ThreadPool。就这样就可以了吗?——不,工程师们并不满足于此,他们不把自己创造出
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 除了可以通过ThreadPoolExecutor自定义线程池外,同Stream API中的Collectors一样,多线程里的Executors类也提供了一组相关的线程池工具,可以直接拿来用,不用考虑用什么队列合适的问题。 Javac除了传统的
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 线程池是个神器,用得好会非常地方便。本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些Java定义好的线程池可以直接使用。但是(凡事总有个但是),还是觉得讲一讲可能跟有助于理解后面的常用线程池,所以该打脸还是打吧-
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 开完一趟车完整的过程是启动、行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速、频繁地踩刹车等动作。因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油。 而一个Java线程完整的生命周期就包括: 1、T1:创建(启动
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ Java中和线程相关的关键字就两:volatile和synchronized。 volatile以前用得较少,以后会用得更少(后面解释)。它是一种非常轻量级的同步机制,它的三大特性是: 1、保证可见性,即强制将CPU高速缓存的数据立即写入主存,
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 从事Java开发这些年来,如果要问我Java当中最难的部分是什么?最有意思的部分是什么?最多人讨论的部分是什么?那我会毫不犹豫地说:多线程。 之前说过I/O是比较裹人概念之二,那么多线程就是那个之一,除了它也没谁了!如果一定要找另外一个特性,那
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 在Java NIO的三大核心中,除了Channel和Buffer,剩下的就是Selector了。有的地方叫它选择器,也有叫多路复用器的(比如Netty)。 之前提过,数据总是从Channel读取到Buffer,或者从Buffer写入到Chann
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 之前在调用Channel的代码中,使用了一个名叫ByteBuffer类,它是Buffer的子类。这个叫Buffer的类是专门用来解决高速设备与低速设备之间速度不匹配的问题的,也可以减少数据库的读写次数。 它又分为输入缓冲区和输出缓冲区。 很多初
阅读全文

摘要:
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 为了解决标准Java I/O令人难以忍受的效率问题,从JDK1.4开始,NIO出现了(Non-blocking I/O,官方称之为New I/O)。NIO不但新增加了许多全新的类,而且还对原来的很多类进行了改写。之所以是NIO,是因为使用它的场
阅读全文

摘要:
在1990年以前,有一帮工程师们认为未来(1990年以后)会有很多小型设备需要得到电脑操控(不得不说,想法非常超前),鉴于当时市面上并没有任何一款编程语言能够跨平台,而且能够在诸如烤面包机这种小型设备上运转,所以他们决定自己创造一个,玩一把大的。 于是Java诞生了。 为了兼顾设备之间的文件处理,J
阅读全文
