
Java
文章平均质量分 81
还不睡呀你。
这个作者很懒,什么都没留下…
展开
-
Java泛型其实很简单(二):泛型,继承,子类型
本系列博客:Java泛型其实很简单(一):泛型类,泛型接口和泛型方法文章目录1 一个常见误区2 泛型类与子类型1 一个常见误区大家都知道:如果Student是Person的子类,那么我们可以将Children的对象赋值给Father的引用。如下:Student s = new Student();Person p = s; // OK.在面向对象中,Student和Person的关系被称为is-a关系(Studentis a Person)。因为Integeris a Number,Do原创 2021-01-04 23:20:47 · 525 阅读 · 0 评论 -
Java泛型其实很简单(一):泛型类,泛型接口和泛型方法
在我的学生时代,Java泛型在我眼里是一个非常难的知识点,看了许多相关的文章,最后都没能学好它。现在回头看,当时犯了两个错:看的文章不成体系,东讲一点,西讲一点;死记硬背,没有理解好。现在工作了,看到了Java官方教程中关于泛型的部分,相见恨晚。讲得真的很好,它用基础简单的例子,成体系的介绍了泛型的使用方法以及简单的原理。推荐英文好的同学可以看看:Lesson: Generics。我写的这篇博客,可以说是Java官方教程的读后笔记吧。如果有不理解或觉得我说得不准确的,欢迎留言或私信交流,我们共同原创 2020-12-11 11:20:57 · 361 阅读 · 1 评论 -
死锁与哲学家吃饭问题
一、死锁情景有5个哲学家,围坐在一张圆桌子上,桌子上放着5根筷子,分别位于两个哲学家之间,如图所示:他们有时会吃饭,有时会思考。吃饭时,哲学家会先拿起左手的那根筷子,再去拿右手的那根。当一个哲学家拿到两根筷子时,就可以开始吃饭,吃着吃着,又会放下筷子开始思考。以上描述的场景,就会出现死锁:在某一时刻,所有的哲学家同时拿起左手边的筷子,再去拿右边的筷子时,发现已经被其他哲学家拿走了。此时,所有的哲学家都在等待另一根永远拿不到的筷子,就形成了死锁。二、造成死锁的原因造成死锁有3个条件,如果出现死锁,那原创 2020-10-11 00:17:23 · 646 阅读 · 0 评论 -
Java的volatile关键字
一、CPU缓存给多线程带来的挑战我们先看一段简单的程序:public class VolatileTest { public static void main(String[] args) throws InterruptedException { MyThread t = new MyThread(); t.start(); Thread.sleep(1000); t.stop = true; // 语句1 }}cl原创 2020-09-25 16:05:56 · 154 阅读 · 0 评论 -
聊聊Java线程状态和常见误区
一、Java Thread文档关于Java的线程状态,[Java Thread文档]讲的非常的清楚了,如果英文水平有4级的话,建议直接阅读文档。(https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html)二、Java线程状态java的线程一共有6个状态:New,Runnable,Waiting,Timed_Waiting,Blocked,Terminate。这里Java使用Thread类的内部枚举类进行表示,我删除文档原创 2020-09-05 17:22:26 · 281 阅读 · 0 评论 -
三大线程模型之读者与写者问题(Java版)
一、前言阅读文章的过程中如果碰到不懂的,可以留言或私信我,我会抽空回答。编程过程中,我们所有遇到的多线程问题,都可以抽象为三种模型:生产者与消费者;读者与写者;哲学家吃饭问题。能搞清楚这三种模型的实现方式与解决方案,在实际编程中碰到多线程问题处理起来才能得心应手。二、读者与写者问题1. 读者与写者问题概述读者与写者问题描述的是一个多线程问题:假设我们有一个资源,它可以被读或者写,在某一时刻,可能有不同的线程尝试着对这个资源进行操作(读或写)。2. 读者与写者的线程安全问题多个线程同原创 2020-08-31 23:33:08 · 1523 阅读 · 0 评论 -
三大线程模型之生产者与消费者(Java版)
一、前言阅读文章的过程中如果碰到不懂的,可以留言或私信我,我会抽空回答。编程过程中,我们所有遇到的多线程问题,都可以抽象为三种模型:生产者与消费者;读者与写者;哲学家吃饭问题。能搞清楚这三种模型的实现方式与解决方案,在实际编程中碰到多线程问题处理起来才能得心应手。二、生产者与消费者1. 什么是生产者消费者?生产者与消费者描述的是这样一个多线程问题:有一个或多个生产者生产出某种物品,然后加入到某个容器中,有一个或多个消费者,会不断的从容器中取走物品。当容器满了的时候,生产者会暂时停止生产原创 2020-08-23 15:31:58 · 306 阅读 · 0 评论 -
同步,异步和多线程,阻塞和非阻塞的差别。
同步,异步和多线程许多人有一个误区:异步和多线程是一件事情。其实不是。我们用一个生活中的例子来解释一下三者的差别。假如你现在有三件家务需要做:1. 煎鸡蛋, 2. 煮开水,3. 打扫客厅同步:你开始煎鸡蛋,等鸡蛋煎完,再去煮开水,开水煮完再去打扫客厅。你得先做完一件事,才会开始做下一件事情,这就是同步;异步:你把鸡蛋丢进锅了,设置了一个闹钟,就去煮开水了。同样,你在开水这边也设置了一个闹...原创 2020-04-06 22:43:07 · 453 阅读 · 0 评论 -
Java多线程(五):内存模型
Java内存模型JVM将内存划分为栈和堆。程序运行过程中,一些本地变量与,引用放在栈中,对象放在堆中。栈是线程私有的(线程安全),每一个线程都有一个自己的栈。硬件内存结构每个线程(CPU)要执行程序时,会将数据从主内存加载到CPU缓存(寄存器),经过一定时间后再写回主内存。...原创 2020-03-17 23:51:58 · 140 阅读 · 0 评论 -
Java多线程(四):竞态和核心代码(Race Conditions and Critical Sections)
竞态可能会在核心代码中法师。如果某部分代码被多个线程执行,如果线程执行的顺序不一样,结果不一样,那么这块代码可以被称为核心代码。核心代码举个例子:public class Counter { protected long count = 0; public void add(long value){ this.count = this.count +...原创 2020-03-17 00:19:00 · 171 阅读 · 0 评论 -
Java多线程:启动线程(三)
Java线程可以执行你写的程序,当你执行main()函数时,JVM会替你创建一个main线程来执行你的程序。Java线程其实也是对象,我们可以在main()函数中创建一个Thread对象并启动它,这样当main线程在执行时,便会创建另一个线程。如何创建并启动Java线程public class JavaThreadTest { public static void main(Stri...原创 2020-03-13 14:19:56 · 151 阅读 · 0 评论 -
Java多线程:类单线程模型(Same-Threading)(二)
类单线程模型是多线程模型的其中一种,英文为Same-Threading。这样子翻译不知道准不准确。单线程编码简单,出错几率小,但是有一个很大的缺陷:如果你的服务器有多个CPU,或一个CPU有多个核,单线程只能使用到其中的一个CPU或一个核,造成极大的浪费。类单线程模型类单线程模型和单线程类似,,但类单线程模型有多个线程,只是每个线程都在做自己的事情,它们之间没有共享变量,工作起来就像单线程一...原创 2020-03-13 00:20:40 · 296 阅读 · 0 评论 -
Java多线程:(一)并发模型
并发系统可以使用不同的并发模型实现,不同的并发模型的线程通过不同的合作方式去处理任务共享状态和分离状态(shared state and separate state)共享状态:所有的线程分享某个状态,这个状态可能是一个object,共享状态可能碰到的问题有死锁,竞态等。非共享状态:不同的线程之间不会有共享的数据,当不同的线程需要交流时,他们通过分享不可变的对象,或copy出一份数据给其...原创 2020-03-09 00:12:51 · 513 阅读 · 0 评论 -
Java:有了Iterator,为何还需要Iterable?
一、Iterator简介直接看源码:public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } defau...原创 2020-01-16 16:05:00 · 253 阅读 · 0 评论 -
工厂模式
一、 简单工厂模式阿毅经营着一家垃圾回收公司,随着公司业务越做越大,回收垃圾的种类也越来越多,垃圾回收的相关代码如下:public class RecycleClient { public void recycle(Thing thing) { RecycleHandler recycleHandler; if ("horse".equals(t...原创 2020-01-01 15:44:52 · 155 阅读 · 0 评论 -
装饰者模式
0. 不断拓展的需求卡牌游戏有着一套严格的战力控制方案。例如我们现在开启一个机关兽活动,为了不让新服务器的玩家拥有机关兽,我们一般会做一个限制:开服天数大于X天的服务器才能开出机关兽活动。现在让你来实现这个返回活动时间的接口,你会如何设计?听起来很简单:public interface Time { long[] getActivityTime();} public clas...原创 2019-12-14 18:12:14 · 85 阅读 · 0 评论 -
笑谈设计模式:策略模式
一、 惊!某程序员手持板砖走向策划,原因竟然是?!阿毅是某公司的程序员,最近负责项目关于武将模块的开发,需求是这样子的:武将需要有名称,品质,可以进行升级,觉醒,不同武将升级,觉醒的逻辑可能相同也可能不同;目前需要实现刘备和关羽两个武将。”不就是简单的面向对象吗?我一天就能搞定“,阿毅心里想。一天过后,代码长这样子:public abstract class Hero { prote...原创 2019-11-30 16:26:26 · 168 阅读 · 0 评论 -
DIY一个Java8的Collector:MyListCollector
目标完成一个简单的MyListCollector,能将对应的Stream转换为ListCollector是什么?举个具体的例子:list.stream().filter(x -> x > 2).collect(new MyListCollector());我们想要将一个list中大于2的所有元素都筛选出来,首先list转化为stream,对每一个元素进行判断。但是判断完以后...原创 2019-10-13 20:40:19 · 114 阅读 · 0 评论 -
Java RMI入门
使用使用JavaRMI服务?一共只需要五步!创建一个Remtote接口,继承java.rmi.Remote。java.rmi.Remote是一个没有任何方法的接口,它只是定义的一个规则,我们自己实现的接口必须继承它。在自定义的接口中的所有方法必须抛出RemoteException异常。在自定义接口中的所有方法的返回值和参数必须是基本数据类型或者继承了Serializable接口。在Ja...原创 2019-08-17 15:30:06 · 121 阅读 · 0 评论 -
Set? set和Set set的区别?
Set<?> set和Set set的区别?Set set这种形式的set,表示set中可以存放任何一种类型的数据,往set中存放数据没有任何数据,但是这样子做是不安全的,因为你无法确定你拿出来的是什么。public class RawType { public static void main(String[] args) { Set set = n...原创 2019-08-16 17:40:06 · 1354 阅读 · 0 评论 -
Java8 lambda表达式之方法引用
static 方法引用public interface Find { public int toFind();}public class MyClass { public static int myFind() { //do something... }}我们想要快捷的利用MyClass中的myFind()来实现Find接口,我们可以这样:Find finder = My...原创 2019-09-16 16:09:46 · 222 阅读 · 0 评论 -
redis开发与运维读书笔记:第二章
2.1 预备2.1.1 全局命令keys *:查询所有的key,遍历所有的key,时间复杂度为O(n)。当数据量很大时,会非常慢,线上不建议使用;dbsize:返回所拥有的key的数量。redis内部有一个记录当前key数量的值,因此时间复杂度为O(1);exists:检查key是否存在;del:删除指定的key,可批量操作;expire:设置过期时间;ttl:返回key的剩余存货...原创 2019-09-25 23:37:39 · 171 阅读 · 0 评论 -
Java8 lambda表达式实战(一·)
一、 提出需求对于程序员来说,唯一不变的需求就是需求永远在变化。你永远不知道,产品经理明天会提出一个怎么样的需求。今天产品经理告诉程序员你:“小吴啊,我们需要完成一个可以筛选出红色苹果的功能。”思考一下,你会如何实现呢?最简单的方法: public static List<Apple> appleColorFilter(List<Apple> appleList) {...原创 2019-09-27 00:14:05 · 549 阅读 · 1 评论 -
实现Function[String, Long],为何String::valueOf可以,Long::toString却不可以?
public class TestMyFunction { public static void main(String[] args) { Function<Long, String> f1 = String::valueOf; Function<Long, String> f2 = Long::toString; //Error!...原创 2019-09-28 17:20:23 · 473 阅读 · 0 评论 -
为何子类泛型List无法赋值给父类泛型List?
先来看代码:public class GenericTest { public static void main(String[] args) { List<Dog> dogs = new ArrayList<>(); List<Animal> animals = new ArrayList<>(); ...原创 2019-08-25 16:34:26 · 4730 阅读 · 4 评论 -
Java多态
一、向上转型(Upcasting)我们先来看一个演奏乐器的代码:public enum Note { MIDDLE_C, C_SHARP, B_FLAT;}public class Instrument { public void play(Note n) { System.out.println("Instrument plays: " ...原创 2019-08-09 10:49:44 · 351 阅读 · 0 评论 -
设计模式之模板方法模式
1、模板方法模式的作用想象一下泡茶和冲咖啡的过程:泡茶:1. 煮开水;2. 打开茶包;3. 将茶包放入开水中;4. 加入蜂蜜;重咖啡:1. 煮开水;2. 打开咖啡包;3. 使用开水冲咖啡;4. 加入白糖;如果现在要你来实现程序,执行这两个过程。你要怎么做呢?最简单直接的做法:class Coffee { void prepareRecipe() { boilWat...原创 2019-07-22 23:58:48 · 425 阅读 · 0 评论 -
Java NIO
1、Java NIO vs IOJava NIO和IO的不同之处NIOIO面向缓冲区面向流no-blockingblockingSelectors面向缓冲区 vs 面向流面向流:从一个文件读取数据后,没有任何的缓存区域。而且每次读完以后都没法再次读取已经读过的内容。面向缓冲区:有一个buffer区域专门用于存储读的数据内容。no-bloc...原创 2019-05-23 17:16:59 · 284 阅读 · 0 评论 -
自己动手实现一个线程池
package day02.multithreadingstudy.threadpool;import java.util.concurrent.LinkedBlockingQueue;@SuppressWarnings("unused")public class MyThreadPool { private final int poolSize; private fin...原创 2019-05-17 18:35:37 · 283 阅读 · 0 评论 -
Java多线程(三)
1、什么是锁锁我们可以理解为一个通行证,一个线程想要对某个共享资源进行访问,需要先获取该资源的通行证(获取锁),并且通行证只能被一个线程持有。通行证持有线程在结束对这些共享数据的访问后必须让出通行证(释放锁),以便其他线程能获取通行证,对该共享资源进行访问。在线程持有锁到释放锁这段时间所执行的代码被称为临界区。临界区一次只能被一个线程执行。2、锁的作用锁可以保证共享资源的原子性,可见性,以及...原创 2019-05-22 20:56:06 · 159 阅读 · 0 评论 -
fork/join
1、什么是fork/join framework?java 1.7开始提供了fork/join framework,目的是为了使用所有可用的cpu去完成一个任务(通过分治)。fork:将一个大任务分割成许多小任务join:将小任务的结果join起来,形成一个结果2、ForkJoinPoolForkJoinPool是fork/join framework的核心,它是ExcutorServi...原创 2019-05-21 18:16:15 · 474 阅读 · 0 评论 -
HashMap死循环问题
HashMap死循环问题HashMap在rehashing的过程中,可能出现死循环问题。什么是rehashing?HashMap的初始容量为16,它的最大装载量为12(threshold = capacity * loadFacotry),当第13个key-value插入时,HashMap需要调用resize()方法进行扩容,重新计算原有的key的hash值,然后通过transfer()将所...原创 2019-05-20 21:35:36 · 255 阅读 · 1 评论 -
Java多线程(一):多线程编程基础
Java多线程编程实战指南核心篇chapter 1读书笔记1、Java可以通过两种方式来新建多线程:继承Thread类public class WelcomeApp { public static void main(String[] args) { // 创建线程 Thread welcomeThread = new WelcomeThread(); /...原创 2019-05-19 18:21:36 · 133 阅读 · 0 评论 -
Java并发编程:4种常用线程池和缓冲队列
一、线程池的概念每次一条线程执行完毕,该线程并不会死亡,而是被放回线程池。这样子避免了频繁创建销毁线程带来的损耗。二、四种常见线程池.ExecutorService:java提供的用来管理线程池的类,线程池的返回对象都是ExecutorService;常用线程池:2.1 Executor.newCacheThreadPool():看线程池里有没有线程,有的话就直接用,没有就创建新的;...原创 2019-04-26 13:31:36 · 2121 阅读 · 0 评论 -
Java内存模型和happes-before规则
JMM内存模型介绍由于cpu的处理速度远远大于主存的读写速度,为了平衡这之间的差距,每个cpu都有自己的缓存(工作内存)。cpu处理数据的时候,会先从主存读取数据到自己的工作内存中,在自己的工作内存中进行修改,最后再写回主存。因此可能出现线程不安全问题:如果线程A在自己的本地内存修改了共享变量后,没有及时写回主存,那么线程B从主存读到的数据会是脏数据。这可以通过线程同步或者volatile关...原创 2019-05-29 16:14:43 · 450 阅读 · 0 评论 -
设计模式之装饰着模式
小王家里新开了一家咖啡店,咖啡店里面有两种咖啡:白咖啡和黑咖啡。Java代码如下:public abstract class Coffee { private String description; //咖啡简介 public Coffee(String description) { this.description = description; }...原创 2019-06-19 15:29:33 · 118 阅读 · 0 评论 -
Java检出异常和非检出异常
检出异常和非检出异常的区别检出异常需要在发生异常的方法中解决,或者抛出。而非检出异常没有这个要求。非检出异常就是RuntimeException。检出异常存在的意义函数就是供外部使用的,它可以理解为一个接口,它有义务告知调用者,它有可能发生一些怎么样的错误,让调用者选择相应的手段来解决它。非检出异常的意义非检出异常(RuntimeException),比如说:NullPointerExc...原创 2019-07-26 11:02:37 · 197 阅读 · 0 评论 -
Java异常(Java Exception)
文章目录1. 什么是Java异常?2. Exception和Error的区别和联系3. java程序是如何处理异常的?4. 一个简单的异常的例子5. 程序员如何解决异常1. 什么是Java异常?java异常是指在Java程序运行期间,碰到的一些非预期的事件,这些非预期的时间会导致程序非正常终止。2. Exception和Error的区别和联系区别:exception:可以捕获err...原创 2019-07-25 23:17:40 · 183 阅读 · 0 评论 -
设计模式之适配器模式
什么是适配器模式如果现在你的手机需要充电,但是你的充电器是两个插,而电源却是三个插,这时候怎么办?我们通过一个适配器,将三插的电源转换为两插的,这就叫适配器模式。适配器模式实例public interface Duck { void quack(); void fly();}public class BlackDuck implements Duck { @Ov...原创 2019-07-16 22:58:01 · 106 阅读 · 0 评论 -
设计模式之命令模式
1. 需求现在,你接到了这样一个需求:给一个遥控器添加功能,每一个按键都对应一个功能。这样的需求该如何实现呢?2. 实现思路引入命令模式,命令Command对应一个接口,我们所有的具体的命令都实现在Command接口,每一个具体的命令都有对应具体的物体,如灯,风扇等。遥控器Remote对应一个类,Remote的成员变量为Command,我们的遥控器并不关心Command中具体到底是什么物体,...原创 2019-07-11 21:57:49 · 87 阅读 · 0 评论