![](https://img-blog.csdnimg.cn/20210219083822388.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
java进阶
文章平均质量分 61
gogogo
咕噜咕噜崩
理想还是要有的
展开
-
观察者模式
观察者模式当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。使用场景:1、一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。2、一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。3、一个对象必须通知其他对象,而并不知道这些对象是谁。4、需要在系统中创建一个触发链,A对转载 2021-05-16 21:08:36 · 72 阅读 · 0 评论 -
代理模式
代理模式创建具有现有对象的对象,以便向外界提供功能接口。使用场景:按职责来划分,通常有以下使用场景:1、远程代理。2、虚拟代理。3、Copy-on-Write 代理。4、保护(Protect or Access)代理。5、Cache代理。6、防火墙(Firewall)代理。7、同步化(Synchronization)代理。8、智能引用(Smart Reference)代理。注意事项和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。实现过程步骤 1创建一个原创 2021-05-16 20:44:02 · 52 阅读 · 0 评论 -
装饰器模式
装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。使用场景:1、扩展一个类的功能。2、动态增加功能,动态撤销。实现过程步骤 1创建一个接口:Shape.javapublic interface Shape { void draw();}步骤 2创建实现接口的实体类。Rectangle.javapublic class Rectangle implements Shape { @Override public void draw() {转载 2021-05-16 20:34:27 · 50 阅读 · 0 评论 -
抽象工厂模式
抽象工厂就是工厂的工厂:将几个简单工厂合并成一个工厂使用场景:1、QQ 换皮肤,一整套一起换。2、生成不同操作系统的程序。实现过程1、先让你选用哪个工厂(生产哪类东西)2、然后再选具体生产那种类型步骤 1为形状创建一个接口。Shape.javapublic interface Shape { void draw();}步骤 2创建实现接口的实体类。Rectangle.javaRectangle.javapublic class Rectangle implemen转载 2021-05-16 20:05:02 · 57 阅读 · 0 评论 -
简单工厂模式
工厂模式在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。(适合复杂的对象)意图: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。使用场景:1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作原创 2021-05-16 19:49:50 · 78 阅读 · 0 评论 -
单例模式
单例模式这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。lazy loading(Lazy 初始化):懒加载,只有当调用该实例时才回去创建。(与之相反的:类加载时创建对象,可能产生浪费)实现方式1、懒汉式,线程不安全是否 Lazy 初始化:是是否多线程安全:否描述:不支持多线程:因为没有加锁 synchronized,所以严格意义上它并不算单例模式。public class Singleton { private static Singleton原创 2021-05-16 18:42:27 · 89 阅读 · 1 评论 -
六大设计原则
单一职责原则理解:不同的类具备不同的职责,各司其职。做系统设计是,如果发现有一个类拥有了两种职责,那么就要问一个问题:可以将这个类分成两个类吗?如果真的有必要,那就分开,千万不要让一个类干的事情太多。总结:一个类只承担一个职责开放封闭原则理解:即开放扩展封闭修改。如果要修改代码,尽量用继承或组合的方式来扩展类的功能,而不是直接修改类的代码。当然,如果能保证对整个架构不会产生任何影响,那就没必要搞的那么复杂,直接改这个类吧。总结:对软件实体的改动,最好用扩展而非修改。里式替换原则理解:父类可被子原创 2021-02-14 19:07:56 · 103 阅读 · 1 评论 -
JDK8-新特性
接口可有默认方法和静态方法????安全时间日期 java.time系列以前时间日期多线程是不安全的,像SimpleDateFormat()就得用ThreadLocal<>使用ISO标准日期就用java.time系列java.time.format:(DateTimeFormatter多线程下安全)...原创 2021-02-17 11:59:09 · 85 阅读 · 1 评论 -
JDK8-java.util.stream
Stream作用就是在不改变源集合、数组条件下,对其中元素进行一顿操作得到想要的数据。Stream创建方式Stream中间操作惰性求值:只有存在Stream终止操作时,才会执行中间操作筛选与切片注:下图中employees是个ListStream filter(Predicate<? super T> predicate)以某种条件过滤掉部分元素:Stream limit(long maxSize)取前maxSize个元素:Stream skip(long n)原创 2021-02-16 20:11:26 · 351 阅读 · 1 评论 -
JDK8-Lambda表达式应用
四大内置核心函数式接口java.util.function使用方式:Lambda方法引用注意点:1. 调用的方法的 参数列表、返回值必须与函数式接口中方法的参数列表、返回值相同。2. 调用的方法名后不用写括号ArrayList<Object> list = new ArrayList<>();list.forEach(System.out::println);// public void forEach(Consumer<? super E> a原创 2021-02-15 19:23:48 · 86 阅读 · 0 评论 -
JDK8-Lambda 表达式
语法格式如下:(parameters) -> expression或(parameters) ->{ statements; }注意1. 参数parameters名必须与Lambda表达式外的任何变量不重名2. expression语句只能使用parameters和Lambda表达式外的final变量lambda表达式的重要特征:parameters:不需要声明参数类型,编译器可以统一识别参数值。一个参数无需定义圆括号,但多个参数需要定义圆括号。expression:原创 2021-01-31 19:25:29 · 161 阅读 · 0 评论 -
JUC-ForkJoinPool
分治思想每个小任务最终都是多线程并发执行的(一个线程一个小任务),所以这个大任务执行过程不能有顺序要求,即:大任务可由小任务执行完后合并而成。应用java.util.concurrent下的Future< V >就是多线程下的单个线程处理的任务,所以MyForkJoin就是个任务。注意点: (Recursive递归的)RecursiveTask< V >有返回值RecursiveAction没有返回值使用ForkJoin框架就得实现其中一种任务package f原创 2021-02-17 16:40:29 · 115 阅读 · 0 评论 -
JCU-线程池
thread.getId()是当前执行线程的ID,每个线程有自己的ID,当一个线程执行完被销毁后,它拥有的ID会被重新分配给其他线程。内存线程池中维护一定数量的线程,进行重复利用。(减少创建、启动、销毁线程的开销)线程从任务队列中取任务执行Java中的线程池工具类Executors:工具类Executors中方法创建固定线程数的线程池创建有调度功能的线程池有执行时间、频率的调度(类似定时器Timer)scheduleAtFixedRate(Runnable command,原创 2021-02-09 21:41:57 · 309 阅读 · 1 评论 -
JUC-java.util.concurrent.locks
Lock lock = new ReentrantLock(); 无论需要同步的代码是不是在一个方法中,只要使用同一个锁对象就能实现同步(和synchronized原理一样)//使用方法 try{ lock.lock(); 同步代码... } finally{ lock.unlock(); }注意,多次重入需要多次释放:thread.interrupt()thread.interrupt();方法对lock.lock()没有用,线程不会中断也不会释放锁,会继续运行。对loc.原创 2021-02-09 12:36:45 · 119 阅读 · 0 评论 -
JUC-ThreadLocal
概念(就是将一个变量与线程绑定)只记1:ThreadLocal都是由private static修饰的ThreadLocal与synchronized区别ThreadLocal相对可以拥有更高的并发性synchronized只提供一个变量(一个工具 => 一支笔 只提供一支笔就会产生哄抢,所以要使用synchronized进行排序)(想起多线程使用同一个SimpleDateFormat就会报错)。而ThreadLocal为每个线程提供一个变量副本(多个工具 => 每人一支笔各用各原创 2021-02-08 20:08:04 · 167 阅读 · 0 评论 -
JUC-无锁并发(CAS/volatile)
知识储备主内存与工作内存Java内存模型的成员变量都存储在主内存(Main Memory)(也就是堆和方法区内存)中,此外每条线程都有自己的工作内存(Working Memory)(也就是栈内存)。线程对成员变量操作: 从主内存中拷贝变量到自己的工作内存 ①> 对变量进行操作后 ②> 将操作后的值写入主内存。volatile本质: volatile 保证了临界值能立即同步到主内存,以及每次使用前立即从主内存刷新。而普通变量做不到这点。(只是在上述①、②过程中实现实时同步,并不是直接修原创 2021-01-18 23:18:44 · 318 阅读 · 1 评论 -
JUC-内存模型
类锁在实例方法中使用:synchronized (this.getClass()){}要注意脏读:对共享数据的改和读都要进行同步, 不然可能出现读取到改动中间值的错误情况。线程出现异常会自动释放锁!!!死锁解决办法:让两个线程方法中的嵌套锁的锁对象顺序一样 /** * 死锁的实质: */ 一个线程: sychronized(a){ sychronized(b){ } } 另一个线程: sychronized(b){ sychronized(a){ }...原创 2021-02-05 21:56:46 · 159 阅读 · 0 评论 -
JUC-线程安全问题
由于不可见会导致的问题是:一个线程从主内存中读取数据后,对数据修改后并不立即刷新到主内存上(而是自己继续用)导致其他线程一直读取的是主内存中的旧数据。原创 2021-02-05 17:22:29 · 161 阅读 · 0 评论 -
JUC-线程基础概念
java中线程Thread中方法判断一个线程是否存活:thread引用.isAlive();阻塞当前线程: Thread.sleep(lang millis);线程六大状态由Thread.State枚举类定义!由thread.getState()方法获得当前线程状态。原创 2021-02-05 14:13:47 · 160 阅读 · 0 评论