- 博客(48)
- 资源 (1)
- 收藏
- 关注
原创 单例模式
单例模式指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式应隐藏其所有的构造方法。单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。优点1在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。2避免对资源
2020-06-16 08:24:26 255
原创 认识一下阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素到容器,而消费者也只从容器里拿元素。四种处理方法1抛出异常是指当阻塞队列已满时候,如果再往队列里插入元素,会抛出IllegalStateException异常。当队列为空时,从队列里获取元素时会
2020-06-10 08:26:41 475
原创 多线程之CAS浅析
CAS简介比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。该操作通过将内存中的值与指定数据进行比较,当数值一样时将内存中的数据替换为新的值。悲观锁总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。在Java中,synchronized的思想就是悲观
2020-06-08 08:18:36 377
原创 volatile
volatile主要对所修饰的变量提供两个功能:可见性和防止指令重排序。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识。内存模型计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,由于程序运行过程中的临时数据是存放在物理内存中的,但是CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令
2020-06-04 08:18:26 185
原创 synchronized底层实现
synchronized简介Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。非线程安全非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改、值不同步的情况,进而影响程序的执行流程。非线程安全问题存在于实例变量中,如果是方法内部的私有变量,则不存在非线程安全问题,所得结果也就是线程安全的。synchronized的使用1.修饰方法2.修饰代码块synchronized取得的锁都是对象
2020-06-03 08:17:50 180
原创 JDK源码(二十六):Hashtable
java.util.Hashtable实现了一个哈希表,存储key-value。任何非null对象都可以用作键或值。要成功地从哈希表存储和检索对象,用作键的对象必须实现hashCode方法和equals方法。Hashtable的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中buckets的数目,初始容量只是创建哈希表时的容量。注意,在“散列冲突”的情况下,一个bucket存储多个条目,这些条目必须按顺序搜索。加载因子是在哈希表的容量自动增加之前允许获得的满容量的度量。初始容量和负载因子参
2020-06-01 08:14:05 160
原创 JDK源码(二十五):HashSet
java.util.HashSet实现了Set接口,由一个哈希表(实际上是一个HashMap实例)支持。它不保证集合的迭代顺序;特别是,它不保证顺序随时间保持不变。这个类允许null元素。HashSet实现Set接口,而Set接口继承Collection,而HashMap实现Map接口,不继承Collection。HashSet 集合不允许存储相同的元素, 它底层实际上使用 HashMap 来存储元素的, 不过关注的只是key元素, 所有 value元素默认为 Object类对象。类名p
2020-05-29 08:20:43 172
原创 JDK源码(二十四):HashMap
java.util.HashMap实现Map接口。此实现提供所有可选的映射操作,并允许null值和null键。(HashMap类大致等同于Hashtable,只是它不同步并且允许空值。)这个类不保证映射的顺序;特别是,它不保证顺序随时间保持不变。HashMap为基本操作(get和put)提供恒定的时间性能,假设哈希函数在存储桶之间正确地分散元素。集合视图上的迭代需要与HashMap实例的“容量”(bucket的数量)加上其大小(键值映射的数量)成比例的时间。因此,如果迭代性能很重要的话,不要设置太高的初
2020-05-28 08:21:30 145
原创 JDK源码(二十三):Calendar
java.util.Calendar类是一个抽象类,它提供了在特定的时间戳和一组Calendar字段之间进行转换的方法,例如年,月,日,小时等等,以及用于操作日历字段的方法,比如下星期的日期。时间的戳可以用毫秒值表示,该值是从1970年1月1日格林尼治标准时间00:00:00.000(公历)开始的偏移量。该类还提供了用于在包外实现具体日历系统的其他字段和方法。这些字段和方法被定义为protected。Calendar对象可以生成实现特定语言和日历样式的日期时间格式所需的所有日历字段值。Calendar定
2020-05-27 08:27:29 458
原创 JDK源码(二十二):ArrayList
java.util.ArrayList是实现List接口的可调整大小的数组实现。实现所有可选的列表操作,可以存储所有类型元素,包括null。除了实现List接口之外,这个类还提供了一些方法来操作内部用于存储列表的数组的大小。(这个类大致相当于Vector,只是它是非同步的)。类名public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess,
2020-05-26 08:25:10 199
原创 JDK源码(二十一):ThreadLocal
ThreadLocal类并不是用来解决多线程环境下的共享变量问题,而是用来提供线程局部变量。这些变量与普通的变量不同,因为每个访问一个变量的线程(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,希望将状态与线程关联(例如,用户ID或事务ID)。每个线程都保持对线程本地变量的副本的隐式引用,只要线程是活的并且ThreadLocal实例是可访问的;在线程离开之后,线程本地实例的所有副本都受到垃圾回收(除非存在对这些副本的其他引用)。实现原理
2020-05-25 08:17:19 238
原创 JDK源码(二十):Thread
进程进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。线程线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个
2020-05-22 08:27:42 241
原创 JDK源码(十九):StringBuilder和StringBuffer
将StringBuilder和StringBuffer放在一起是因为这2个类的代码差不多,只是StringBuilder是线程不安全的,而StringBuffer是线程安全的。当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间
2020-05-20 08:22:25 134
原创 JDK源码(十八):String
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。字符串常量池作为最基础的引用数据类型,Java 为 String 提供了字符串常量池以提高其性能。字符串常量池存在于方法区中。 字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能 JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化 为字符串开辟一个字符
2020-05-19 08:24:06 232
原创 JDK源码(十七):ClassLoader
顾名思义,类加载器(ClassLoader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java
2020-05-14 08:04:39 699
原创 JDK源码(十六):Field
java.lang.reflect.Field提供类或接口的单个字段的信息和动态访问。反射字段可以是类(静态)字段或实例字段。Field类提供了获取和设置某个类的字段的属性值。在java.lang.Class获取Field对象的方法总共有四个:1. getDeclaredField(String name);返回一个 Field 对象,name参数表示字段的名称(包括私有的)。2. getDeclaredFields();返回 Field 对象的一个数组,表示的类或接口所声明的所有字段(
2020-05-13 08:23:54 457
原创 JDK源码(十五):Method
java.lang.reflect.Method类描述的是类的方法信息(包括:方法修饰符、方法名称、参数列表等等)。在java.lang.Class获取Method对象的方法总共有四个:我们可以根据方法名称得到该方法的Method对象,然后调用Method对象的invoke方法实现方法的调用,这也是Method最重要的用法。invoke(Object obj, Object... args) @CallerSensitive public Object invoke(O.
2020-05-12 08:17:42 313
原创 JDK源码(十四):Class
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。在日常开发过程中,会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。比如JDBC链接:Class.forName("com.mysql.cj.jdbc.Driver");反射机制的相关类Class代
2020-05-11 08:37:54 484
原创 JDK源码(十三):ObjectInputStream
java.io.ObjectInputStream是实现反序列化的关键类,ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象,以流的方式读取对象。其它的用途包括主机之间使用socket流传递对象、远程系统调用。ObjectInputStream确保从流创建的所有对象的类型与Java虚拟机中的类匹配。类根据需要使用标准机制加载。只能从流中读取实现java.io.Serializable或java.io.Externalizable接口..
2020-05-09 08:29:24 663
原创 JDK源码(十二):ObjectOutputStream
java.io.ObjectOutputStream是实现序列化的关键类,它可以将一个对象转换成二进制流。ObjectOutputStream将Java对象的原始数据类型写入OutputStream。可以使用ObjectInputStream读取(重新组合)对象。对象的持久存储可以通过使用流的文件来实现。如果流是网络套接字流,则可以在另一台主机上或在另一个进程中重建对象。只有实现java....
2020-05-08 08:23:29 378
原创 JDK源码(十一):FileOutputStream
FileOutputStream用于写入原始字节流,如图像数据。要编写字符流,请考虑使用FileWriter。文件输出流是将数据写入文件或文件描述符的输出流。文件是否可用或是否可以创建取决于底层平台。特别是某些平台,一次只允许一个FileOutputStream(或其他文件写入对象)打开一个文件进行写入。在这种情况下,如果所涉及的文件已打开,则此类中的构造函数将失败。public cla...
2020-05-07 08:00:57 332
原创 JDK源码(十):FileInputStream
FileInputStream从文件系统中的文件获取输入字节。哪些文件可用取决于主机环境,FileInputStream用于读取原始字节流,如图像数据。要读取字符流,请考虑使用FileReader。public class FileInputStreamDemo { public static void main(String[] args) throws IOExcepti...
2020-05-06 08:14:37 294
原创 JDK源码(九):File
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。File对象代表磁盘中实际存在的文件和目录,File类实现了Serializable,表示可以被序列化。File类内部依赖于FileSystem,FileSystem为本地文件系统抽象打包私有抽象类。抽象出了一个FileSystem来表示文件系统,不同的操作系统通过继承该类实现各自的文件系...
2020-04-30 08:20:56 521
原创 JDK源码(八):CharArrayWriter
CharArrayWriter类实现了一个可用作字符输出流的字符缓冲区,当数据写入流时,缓冲区自动增长,请注意在此类上调用close()无效,并且可以在流关闭后调用此类的方法而不生成IOException。 import java.io.CharArrayReader; import java.io.CharArrayWriter; import java.io.IOException...
2020-04-30 08:10:43 187
原创 JDK源码(七):CharArrayReader
CharArrayReader 是字符数组输入流,用于将自带的内置缓存字符数组中的字符读取到程序中。private static void main() throws IOException { String str = "Hello world!"; // 构建字符输入流 CharArrayReader reader = new Char...
2020-04-29 08:18:42 132
原创 JDK源码(六):ByteArrayOutputStream
ByteArrayOutputStream是字节数组输出流,在内存中创建了一个字节数组,所有发送到输出流的数据都会保存到该字节数组的缓冲区中。当数据写入缓冲区时, 缓冲区大小会按需增长。可以使用toByteArray和toString取出数据。public class ByteArrayOutputStreamDemo { public static void main(Strin...
2020-04-29 08:14:14 418
原创 JDK源码(五):ByteArrayInputStream
ByteArrayInputStream 是字节数组输入流。它继承于InputStream。 它包含一个内部缓冲区,该缓冲区包含从流中读取的字节,它的内部缓冲区就是一个字节数组,而ByteArrayInputStream本质就是通过字节数组来实现的。 我们都知道,InputStream通过read()向外提供接口,供它们来读取字节数据;而ByteAr...
2020-04-28 07:57:29 268
原创 BufferedWriter的使用及源码分析
学习更多源码,请关注微信公众号:jdkSpring,或者微信扫一下二维码: BufferedWriter 是缓冲字符输出流。它继承于Writer。它的作用是为其他字符输出流添加一些缓冲功能,能够提高效率。 BufferedWriter是给FileWriter提高效率用的,比如当我们向磁盘中不断的写入字节时或者将一个非常大单位是G的字节数据写入到磁盘的指定文件中,每写...
2020-04-03 10:50:57 1765
原创 BufferedReader的使用及源码分析
学习更多源码,请关注微信公众号:jdkSpring,或者微信扫一下二维码: BufferedReader是为了提供读的效率而设计的一个包装类,它可以包装字符流。可以从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取. BufferReader的作用是为其它Reader提供缓冲功能。创建BufferReader时,我们会通过它的构造函数指定某个Reade...
2020-04-03 10:23:30 1178
原创 JDK源码(二):BufferedOuputStream
学习更多源码,请关注微信公众号:jdkSpring,或者微信扫一下二维码:BufferedOutputStream 是缓冲输出流。它继承于FilterOutputStream。BufferedOutputStream 的作用是为另一个输出流提供“缓冲功能”。import java.io.*;public class BufferedOutputStreamDemo { ...
2020-03-17 12:22:34 144
原创 Linux中nginx配置Vue+spring boot
1.在linux中创建一个目录存放打包好的Vue文件,这里我是在根目录 / 下创建一个html文件夹。sudo mkdir html2.在linux中安装nginx,这里用的是 yum 安装。#先将nginx添加到yum源中rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-...
2019-11-05 16:55:40 806
原创 vue使用总结
一.vue部署到tomcat 1. 修改config目录下的index.js2.执行npm run build命令之后,把dist目录下的index.html和static文件夹拷贝到tomcat中的webapps目录下ROOT文件中,启动tomcat,在浏览器中输入http://localhost:8080即可访问3.如果你想要的地址是http://loca...
2018-05-15 15:31:57 309
原创 java泛型
/** * java 泛型是javase 1.5的新特性,泛型的本质是参数化类型, * 也就是说所操作的数据类型被指定为一个参数 * 这种参数类型可以用在类、接口和方法的创建中 * 分别称为泛型类、泛型接口和泛型方法 * java语言引入泛型的好处是安全简单, * 在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率 * * 泛型的类型参数只能是类类型,不...
2018-02-23 09:31:10 193
原创 vue(五):vue-router的使用
由于vue-router在vue1.0和2.0中写法不一样,这里我们只看2.0版本的写法。首先看一下我们最后的结果:点击上面三个标签,在下面显示对应的内容。首先引入vue-router,在package.json中的dependencies中添加vue-router的版本,如图:还需要新建3个组件来做vue-router的测试,goods、ratings、seller对应上
2018-02-03 14:28:36 799
原创 vue学习(四):子组件向父组件传参
子组件向父组件传参主要依靠 v-on 和 $.emit这个是vue官网上给的方法调用,我们看看页面上怎么使用。子组件 main_Header.vue {{count}} {{item}} 向父组件传参 export default { name: 'main_header', props: ['count', 'list'],
2018-01-25 14:22:54 22358
原创 vue学习(三):父组件向子组件传参
既然是组件化开发,当然少不了数据传递,我们先看看官网上写的。使用props传递参数,试一下,还是用我们之前的项目结构一、静态传递1.main_header.vue {{msg}} export default { name: 'main_header', props: ['msg'] // 声明传递过来的数据msg }2.App.v
2018-01-17 14:03:39 4165
原创 redis学习(三):redis的配置文件redis.conf
# redis启动命令# ./redis-server /path/to/redis.conf# redis的单位对应的字节数,单位不区分大小写# 1k => 1000 bytes# 1kb => 1024 bytes# 1m => 1000000 bytes# 1mb => 1024*1024 bytes# 1g => 1000000000 bytes# 1gb => 1
2018-01-15 10:24:28 4860
原创 vue学习(二):组件化开发
首先看看vuedemo的入口函数main.js// The Vue build version to load with the `import` command// (runtime-only or standalone) has been set in webpack.base.conf with an alias.import Vue from 'vue' // 引入vueimpo
2018-01-08 10:36:50 1576 1
原创 redis学习(二):redis基本数据类型
redis的基本数据类型有五个,分别为:string 、list、hash、set、zset。string类型:string是redis最基本的类型,一个key对应一个value。 string类型是二进制安全的,可以包含任何类型。一个redis中字符串value最多可以是512M。string常用命令:set [key] [value] :设置
2018-01-06 15:40:12 302
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人