Java
JDK新特性,JVM 虚拟机, 并发编程
美好生活521
这个作者很懒,什么都没留下…
展开
-
Java内存模型
Java Memory Model (JMM)一、对象的创建过程首先类如果没有加载的话先进行加载,包括3个步骤:1、class loading,将class加载到内存;2、class linking,校验,将类的静态变量赋默认值,解析;3、class initializing,静态变量赋初始值,并执行静态代码块然后创建对象:1、申请对象内存2、成员变量赋默认值3、调用构造方法:将成员变量按顺序赋初始值,执行构造方法,首先要调用super构造方法。二、对象布局.原创 2021-12-06 19:33:34 · 399 阅读 · 0 评论 -
Java GC 垃圾回收器
Java,GC,垃圾回收算法,垃圾回收器原创 2021-12-07 17:13:42 · 491 阅读 · 0 评论 -
JVM 虚拟机类加载过程和双亲委派机制
Java 编译后的字节码 Class 文件加载到虚拟机后才能运行和使用。类加载过程包括 Loading 加载,Verification 验证,Preparation 准备,Resolution 解析,Initialization初始化几个步骤。1、加载 Loading...原创 2021-12-06 14:49:33 · 736 阅读 · 0 评论 -
Java 虚拟机运行时数据区
Java 虚拟机运行时数据区;堆,虚拟机栈,本地方法栈,程序计数器,直接内存,方法区,运行时常量池;Java 内存分区原创 2021-12-07 17:13:23 · 149 阅读 · 0 评论 -
Java Class 文件结构
Java 类文件结构是一个二进制字节流,由 Java 虚拟机解释。编译后的class文件用编辑器16进制打开,类似下图的样子,1个16进制是4位,2个16进制是1个字节。前几位一般都一样,CA FE BA BE,为魔术值 Magic Number,占四个字节。第二部分为版本号,Minor Version 两个字节,Major Version 两个字节,例子里的34换成10进制为52,表示JDK8。第三部分为常量池中个数, constant_pool_count,008D(141),两..原创 2021-12-06 10:37:49 · 864 阅读 · 0 评论 -
Java 标记接口
Marker interface,标记接口,在Java 中是没有任何方法定义的接口。常见的几个标记接口有:java.lang.Cloneable,如果一个对象要使用clone方法,这个对象对应的类必须要实现Cloneable接口,否则会报 CloneNotSupportedException异常。java.io.Serializable,支持序列和反序列化。java.util.RandomAccess,支持随机访问,例如,ArrayList 实现了 RandomAccess 接口,可以使用随原创 2021-12-01 10:26:23 · 3688 阅读 · 0 评论 -
Java 设计模式之 State 状态模式
状态模式用于由状态决定行为的场景,原创 2021-07-27 12:14:45 · 140 阅读 · 0 评论 -
Java 设计模式之 Composite 组合模式
Composite原创 2021-07-31 22:56:28 · 168 阅读 · 0 评论 -
Java 设计模式之 Visitor 访问者模式
Visitor 访问者模式原创 2021-07-27 14:49:56 · 164 阅读 · 0 评论 -
Java 并发编程之 ConcurrentLinkedQueue
适用于高并发下对集合类进行操作的场景。常用的线程安全方法有offer,add,poll,peek,底层通过cas 实现对容器的原子操作。一个很简单的使用例子如下:public class ConcurrentLinkedQueueTest { private static Queue<String> coupons = new ConcurrentLinkedQueue<>(); public static void main(String[] arg原创 2021-07-22 14:09:56 · 249 阅读 · 0 评论 -
Java 设计模式之 Observer 模式
这种模式抽象出三个角色,被观察者,观察者,事件。观察者:将观察者抽象为interface接口,将观察者的行为抽象为一个个方法,具体观察者通过实现观察者接口,并实现这些方法,来赋予具体的行为。被观察者:发出某些事件,将事件通知给观察者。事件:事件里将被观察者作为成员对象,这样需要对原对象进行处理,或者使用原对象的方法时,可以从事件里获得事件原对象。被观察者发出某事件,通知观察者,观察者根据事件作出响应。举个咖啡馆Cafe的例子,客户进来,要点餐,要结账,服务员会拿过来菜单,账单。观察者原创 2021-07-22 10:41:51 · 343 阅读 · 0 评论 -
Java 设计模式之 Abstract Factory 抽象工厂模式
在工厂方法基础上,将工厂的生产方法的返回类型从具体产品抽象为抽象产品,同时扩展工厂的方法,支持任意定制产品族,则工厂方法可以升级为抽象工厂模式,比如一家餐厅可以提供牛排(方法A),红酒(方法B),蔬菜汤(方法C),另一个餐厅可以提供水煮鱼,橙汁,乌鸡汤。抽象产品类:/** * 主菜抽象类 */public abstract class MainCourse { abstract void printName();}public abstract class Drink {原创 2021-07-20 12:40:34 · 128 阅读 · 0 评论 -
Java 并发编程之 LockSupport
LockSupport 可以用于阻塞当前线程的执行,以及唤醒指定的线程,常用的方法包括park() 和 unpark(thread),比wait和notify更灵活。public class LockSupportTest { public static void main(String[] args) { Thread thread = new Thread(() -> { for (int i=0; i<20; i++) {原创 2021-07-19 21:01:55 · 90 阅读 · 0 评论 -
Java 设计模式之Bridge桥接模式
将抽象和具体实现两个维度分离,让他们独立发展,并且在抽象类里聚合一个具体实现,通过聚合替代继承,用于解决类爆炸的问题。这种模式要求对系统的抽象的理解和设计难度都比较大。例子:这里要对花,气球等装饰物进行显示,可以显示一个装饰物,也可以显示多个装饰物,那么将装饰物作为具体实现,将显示作为抽象类,在抽象类里有一个装饰物的引用,对抽象类进行扩展可以进行多次显示,对具体实现扩展为不同类型装饰物。Display,NumberDisplayDisplayImpl, FlowerDisplayImpl原创 2021-07-19 12:20:56 · 186 阅读 · 0 评论 -
Java 设计模式之装饰器模式
定义一个装饰类,给原有对象(被装饰者)加点新功能。实现:装饰者和被装饰者具有相同的接口,装饰者在被装饰者已有功能基础上加点新功能。例子,比如给冰激凌加点香草味,加点巧克力,冰淇淋和加料都有相同的接口食物。看代码,好不容易写出来的,理解了,以后再也不会蒙圈了。/** * 装饰类和被装饰类共同继承的抽象类 * 使装饰类和被装饰类具有一致性 */public abstract class Food { /** 待被装饰者和装饰者具体发挥 */ public abstrac原创 2021-07-17 13:44:24 · 493 阅读 · 0 评论 -
Java 设计模式之Mediator调节者模式
使用场景:对象之间的交互很复杂时,定义一个调节者对象封装一系列对象之间的交互,使原有对象之间解耦,只与调节者对象交互。结构模式:抽象调节者接口Mediator,具体调节者实现类ConcreteMediator抽象被调节者接口Colleague,具体被调节者实现类Buyer, Seller每个被调节者拥有一个调节者对象优点:降低对象之间的耦合度;将一对多关联转为一对一关联,提高系统灵活性,使系统易于扩展和维护缺点:当对象很多时,调节者的职责会很大,不好维护举个房屋买卖原创 2021-07-17 13:35:04 · 185 阅读 · 0 评论 -
Java 设计模式之Facade门面模式
场景:当外界某个对象与某个系统内的多个组件都要进行交互时,这个系统可以对外提供一个统一的接口,与外界这个对象对接,这样可以对外隐藏系统内部的复杂性,接口内部调用各个组件功能。实现:定义一个Facade, 有多个组件就定义多个MemberA,MemberB等等。例子:package com.example.demo.designpattern.facade;/** * 某系统内组件A */public class MemberA { public void work() {原创 2021-07-17 13:25:14 · 174 阅读 · 0 评论 -
Java 设计模式之代理模式
代理模式原创 2021-06-14 13:38:43 · 1173 阅读 · 1 评论 -
Java 并发编程之 ConcurrentHashMap,ConcurrentSkipListMap
Java并发容器Map类有两个,ConcurrentHashMap和ConcurrentSkipListMap,前者是无序的,后者有序。public class ConcurrentHashMapTest { private static final int len = 20; public static void main(String[] args) { ConcurrentHashMap<String, String> map = new Concu原创 2021-04-24 15:07:55 · 176 阅读 · 0 评论 -
Java 并发编程之 CopyOnWriteArrayList
简单说就是读写分离,读不加锁,增删改时加锁复制,线程安全;写的效率比较低,相对Vector类读写都加锁,CopyOnWriteArrayList读的效率更高,适合读多写少,并且不要求实时一致性的使用场景。方法有:public boolean add(E e),public void add(int index, E element)public E set(int index, E element),public E get(int index)public E remove(int .原创 2021-04-24 13:43:28 · 231 阅读 · 0 评论 -
Java 并发编程之 FutureTask
FutureTask 类构造函数参数为 Callable 接口,实现 RunnableFuture 接口,而 RunnableFuture 接口继承了 Future 和 Runnable 接口,所以它既是一个线程,也可以有返回结果。使用栗子如下:1)定义一个Callable 任务public class CallableTask implements Callable<String> { private long sleepTime; public Call原创 2021-04-18 20:47:50 · 147 阅读 · 0 评论 -
Java 并发编程之 Callable 和 Future
ExecutorService 执行完Callable 任务后,返回 Future 对象,Future 对象包含线程的状态和结果对象。Future的get方法可以获得 Callable任务执行后的结果,isDone, isCanceled 方法判断线程状态。使用也很简单,public class CallableTest implements Callable<String> { public static void main(String args[]) {原创 2021-04-18 20:20:07 · 138 阅读 · 0 评论 -
Java 并发编程之线程池 ScheduledThreadPool
ScheduledThreadPool 为定时任务线程池1)定义任务线程public class Task implements Runnable { private String name; Task(String name) { this.name = name; } @Override public void run() { System.out.println(Thread.currentThread(...原创 2021-04-18 19:41:14 · 437 阅读 · 0 评论 -
Java 并发编程之自定义线程池 ThreadPoolExecutor
1)定义一个任务线程public class Task implements Runnable { private String name; Task(String name) { this.name = name; } @Override public void run() { System.out.println(Thread.currentThread().getName() + " Start." + name);原创 2021-04-18 15:57:31 · 190 阅读 · 0 评论 -
Java 并发编程之线程池 ExecutorService 接口
Java 并发编程任务执行Executor原创 2021-04-18 15:30:08 · 145 阅读 · 0 评论 -
Java 并发编程之同步工具类 Exchanger
Exchanger 交换器,用于两个线程之间交换数据。线程1调用exchange()方法,然后进行线程阻塞,等待线程2调用exchange()方法交换数据,线程2调用exchange()方法后,两个线程继续执行。例如:public class ExchangerTest { public void a (Exchanger<String> exch) { System.out.println("a 方法执行..."); try {原创 2021-04-05 19:59:29 · 124 阅读 · 0 评论 -
Java 并发编程之同步工具类栅栏 CyclicBarrier
Java 并发编程栅栏 CyclicBarrier原创 2021-04-05 19:58:13 · 144 阅读 · 1 评论 -
Java 并发编程之同步工具类信号量 Semaphore
Java 并发编程信号量 Semaphore原创 2021-04-05 19:58:00 · 121 阅读 · 2 评论 -
Java 并发编程之同步工具类闭锁 CountDownLatch
Java 并发编程闭锁 CountDownLatch原创 2021-04-05 19:57:50 · 91 阅读 · 2 评论 -
Java 并发编程之 ThreadLocal 线程局部变量
JAVA并发编程ThreadLocal 线程局部变量原创 2021-04-05 19:57:34 · 149 阅读 · 0 评论 -
Java 并发编程之读写锁 ReentrantReadWriteLock
ReentrantReadWriteLock 允许多个读操作同时进行,但是只允许一个写操作同时进行,在某些情况下,可以实现更高的并发性。举个栗子:public class ReadAndWriteLockTest { static { System.out.println("static "+Thread.currentThread().isDaemon()); } public static void main(String[] args) {原创 2021-04-05 19:57:12 · 122 阅读 · 1 评论 -
Java 并发编程之可重入锁 ReentrantLock
Java 并发编程显示锁 ReentrantLock原创 2021-04-05 13:55:43 · 119 阅读 · 1 评论 -
Java 并发编程之 Atomic 类
Java 并发编程任务取消原创 2021-04-05 12:37:35 · 102 阅读 · 1 评论 -
Java 并发编程之 volatile
Volatile 线程可见性原创 2021-04-05 11:22:24 · 80 阅读 · 0 评论 -
Java 并发编程之创建线程,启动和常用方法
进程是处于运行过程中的程序;线程是进程中的一个执行单元;一个程序运行后至少有一个进程,一个进程中可以包含多个线程。1)继承 Thread 类public class MyThread extends Thread{ @Override public void run() { for (int i=0; i<5; i++) { try { TimeUnit.SECONDS.sleep(1);原创 2021-04-03 21:08:48 · 113 阅读 · 0 评论 -
Java 并发编程之内置锁 synchronized
Java 并发编程内置锁 synchronized原创 2021-04-05 10:27:04 · 138 阅读 · 0 评论 -
JDK8 日期使用
直接通过一个例子,说明JDK8新增的日期的使用。import java.time.*;import java.time.format.DateTimeFormatter;import java.util.Date;public class TimeConfig { public static void main(String[] args) { // Date 与 Instant 相互转换 Date date = new Date();原创 2020-09-22 18:04:50 · 130 阅读 · 0 评论 -
JDK8 Stream 操作
stream reduce返回计算流的聚合结果,平均、最大、小值,求和。stream collect返回collection集合实例。原创 2020-10-27 21:55:16 · 127 阅读 · 0 评论