JavaSE
JoyceYIDA
do myself
展开
-
线程池
为什么要使用线程池?创建多线程,系统要处理很多执行时间很短的请求,系统要不断的进行创建和销毁线程,线程池通过重复利用已创建的线程降低创建和销毁带来的消耗,降低资源的消耗。当任务到达的时候任务可以不用等待线程创建就直接立即执行,提高的响应速度。使用线程池可以统一的进行线程的分配、调度和监控。提高线程的可管理性。线程池的实现:ExecutorService service=new Thr...原创 2019-12-27 16:28:43 · 111 阅读 · 0 评论 -
this、final、static、super关键字小总结
this关键字:1.调用本类属性 this.属性名:明确表示调用类中同名属性 规范:在类的普通方法中访问本类属性,必须加this关键字。2.调用本类方法 a:调用普通方法:this.方法名(参数) b:调用构造方法:this(参数) 规范:this调用本类其他构造方法时,必须放在首行调用;this调用构造方法不能成环。3.表示当前对象:只要有某一个对...原创 2019-05-09 19:15:10 · 189 阅读 · 0 评论 -
Java的内存模型
Java的内存模型:基于线程的内存模型JMM 定义的主要目标:为了定义程序中各个变量的访问规则,也就是如何将变量从内存中取出来,怎样将它写入。这里的变量是实例字段、静态字段和数组元素(线程共享)一、主内存与工作内存。主内存也就是所有内存共享区域(堆、方法区、运行时常量池);工作内存就是每个线程独享的区域。 JMM规定所有变量都必须存储到主内存中,每条线程都有自己的工作内存,其中保存了该...原创 2019-05-08 16:47:54 · 103 阅读 · 0 评论 -
深浅拷贝浅理解
package JVM3;//浅拷贝:对象值的拷贝,拷贝出来的对象仍然保留原对象的所有引用//class Teacher{// private String name;// private String job;//// public Teacher(String name, String job) {// this.name = name;...原创 2019-05-05 19:25:31 · 257 阅读 · 1 评论 -
死锁的实现
//死锁的实现//一个线程等待另一个线程执行完毕后才可以继续执行,但如果现在相关的线程彼此都在等待着,那么就会造成死锁。class Pen{ private String pen="笔"; public String getPen() { return pen; }}class Book{ private String boo...原创 2019-04-20 13:41:06 · 347 阅读 · 0 评论 -
synchronized优化详解
JDK1.5提供了Lock锁 Lock是一个接口,常用子类ReentrantLock 使用Lock锁必须在finally块里释放锁synchronized优化 悲观锁:假设每一次执行同步代码块均会产生冲突,所以当线程获取锁成功,会阻塞其他尝试获取该锁的线程 乐观锁:假设所有线程访问共享资源时不会出现冲突。 既然不会出现冲突自然就不会阻塞其他线程。线程不会出现阻塞状态...原创 2019-04-20 13:38:07 · 125 阅读 · 0 评论 -
线程的同步
守护线程(后台线程):是一种特殊的线程,属于陪伴线程(垃圾回收线程)Java中两种线程:用户线程(false)和守护线程(true),可以用isDaemon()来判断是不是守护线程只要当前JVM进程中存在任何一个用户线程没有结束,守护线程就在一直工作,只有当最后一个用户线程停止后,守护线程会随着JVM进程一同停止。setDaemon()将当前线程设置为守护线程Java中启动的线程默认为用户...原创 2019-04-20 13:36:09 · 90 阅读 · 0 评论 -
ReentrantLock和ReentrantReadWiteLock
ReentrantLock可重入锁:内建锁隐式支持可重入锁,通过自增获取,自减释放的方式来实现可重入。特点:1)线程获取锁的时候,如果当前线程已经持有锁,直接尝试再次获取2)由于锁可以被获取N次,所以释放的时候要释放N次之后才能算是真正的释放成功。源码及分析:final boolean nonfairTryAcquire(int acquires) { ...原创 2019-04-28 14:18:40 · 105 阅读 · 0 评论 -
获取同步状态(AQS中的模板方法)
void acquire(int arg):独占式获取同步状态,如果获取失败则将当前现场插入同步队列进行等待。 1)调用tryAcquire使用CAS尝试再次获取同步状态,若成功方法直接返回,把当前线程置为持有锁线程; 若再次尝试失败,调用addWaiter() 2)剖析源码:将当前线程封装为Node节点后尾插入同步队列 ...原创 2019-04-28 13:36:35 · 482 阅读 · 0 评论 -
内置线程池的理解
线程池核心处理执行: 组件:核心线程池,阻塞队列,最大线程池,处理策略 第一步:判断核心线程池是否已满(不管是否有空闲线程),如果未满,创建一个新的线程来执行任务。 如果已满,判断是否有空闲线程,有的话将任务分配给空闲线程,否则执行步骤2。 【创建线程需要获得全局锁】 第二步:判断工作队列(阻塞队列BlockingQueue),如果未满,将任务存储在工作队列中等待空...原创 2019-04-23 16:45:00 · 118 阅读 · 0 评论 -
Java线程池小结
为什么要用线程池?要创建多线程,系统要处理很多的执行时间很短的请求,系统要不断地创建和销毁,创建一个线程池就可以重复利用已创建的线程来降低创建与销毁带来的损耗 提高响应速度,任务到达时,无需等待线程的创建就可以直接执行 有了线程池,就讲多线程进行了统一的管理,可以统一的进行任务的分配,调度和监控。线程池的实现:通过ExecutorService来new一个ExecutorThr...原创 2019-04-23 18:08:14 · 159 阅读 · 0 评论 -
消费生产者模型
package pc;public class Goods { private String name; private double price; public Goods(String name, double price) { this.name = name; this.price = price;...原创 2019-04-26 15:00:07 · 83 阅读 · 0 评论 -
三范式和属性文件操作
三范式-BCNF(数据表设计) 1NF<2NF<3NF 1NF:所有关系数据表都必须满足的范式 表中所有的属性必须是原子的,不可再分的。表中不能有子表。 2NF:表中的所有非主属性不存在对主码的部分函数依赖 主属性:能唯一确定一行数据的属性 函数依赖:一个主属性通过一种限制唯一能找到其他属性,主属性和其他属性的映射关系就叫函数依赖...原创 2019-04-26 14:57:07 · 129 阅读 · 0 评论 -
Java工厂设计模式
1.实现简单工厂模式:优点:简单易于实现,把类的实例化操作交给工厂类;缺点:添加具体产品时需要修改工厂,违背了OCP原则将客户端的new操作解耦到工厂类中组成:一个抽象产品类/接口;多个具体产品类;一个工厂;产品个数少的场景比较适合用简单工厂模式interface IComputer{void print();}class Mac implements IComputer{@O...原创 2019-05-14 18:36:05 · 89 阅读 · 0 评论 -
Java的抽象类
抽象类就是比普通类多了一些抽象方法而已(用abstract关键字定义)抽象类的规定:1.一定存在构造方法,子类也一定先调用父类构造;在调用子类构造。2.允许没有任何抽象方法,但是仍然不能直接实例化对象,依然要用子类通过向上转型实例化父类。3.final关键字定义的类不能被继承;private定义的类被封装不能被继承;而abstract定义的类必须要有子类;所以final和private其中之...原创 2019-05-11 20:14:15 · 124 阅读 · 0 评论 -
JVM2:垃圾回收器与垃圾回收算法
JDK1.6垃圾收集器有:Serial收集器、parNew收集器、CMS收集器Serial收集器:新生代的单线程收集器,使用一个CPU或者一条收集线程区完成垃圾收集工作,更重要的是,在它运行垃圾收集工作时,不许赞人听其他所有工作线程(stop the world)直到他收集结束。他依然是虚拟机运行在Client模式下的弄人新生代收集器。优点:简单高效。采用的算法是复制算法。parNew收集器:...原创 2019-06-08 17:51:19 · 109 阅读 · 0 评论 -
JVM3:内存分配、回收策略、内存模型JMM
JVM是整个计算机的虚拟模型,JMM属于JVMJava的内存模型:基于线程的内存模型,简称JMMJMM 定义的主要目标:为了定义程序中各个变量的访问规则,也就是如何将变量从内存中取出来,怎样将它写入。定义了虚拟机(JVM)在计算机内存中(RAM)的工作方式。这里的变量是实例字段、静态字段和数组元素(线程共享)一、主内存与工作内存。主内存也就是所有内存共享区域(堆、方法区、运行时常量池);工作...原创 2019-08-11 18:57:30 · 134 阅读 · 0 评论 -
基于WebSocket的多人网页聊天室
之前做过基于局域网的多线程聊天室,之前的项目功能有所欠缺,各部分功能的实现都是在控制台进行的,采用webSocket之后可以让前端和后端向C/S模式(客户端服务器)一样进行实时通信,不在需要每次单独发送请求。WebSocket允许通过JS建立和服务器的连接,WebSockt实现了全双工通信(不需要客户端发送请求,服务器就可以直接向服务端发送数据)项目实现:每当有一个客户端连入、关闭、发送消息都...原创 2019-08-07 09:48:44 · 446 阅读 · 0 评论 -
Java多线程:公平锁、重入锁、读写锁、共享锁、乐观锁、分段锁
公平锁公平性是针对获取锁而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求上的时间顺序,满足FIFOReentrantLock和ReentrantReadWriteLock默认都是非公平锁,公平锁在ReentrantLock和ReentrantReadWriteLock中的实现增加了hasQueuedPredecessors的逻辑判断,该方法用来判断当前节点在同步队列中是否有前驱节点,...原创 2019-08-05 22:10:37 · 244 阅读 · 0 评论 -
Java多线程3:Lock锁--AQS,ReentrantLock
Lock接口是JDK1.5以后新增的,需要显式加锁,拥有了获取和释放锁的可操作性,可中断地获取锁,可超时获取锁等synchronized关键字所不具备的同步特性。通过子类进行实例化Lock的使用:Lock lock=new ReentrantLock(); lock.lock(); try{ }finally { ...原创 2019-08-05 21:25:04 · 126 阅读 · 0 评论 -
Java多线程1:线程的创建、synchronized的优化、死锁
线程与进程的区别:从根本来看:进程是操作系统分配资源的基本单位;线程是任务调度和执行的基本单位开销方面:每个进程都有自己独立的代码和数据空间,进程之间的切换有交大的开销;而一个线程类共享代码和数据空间,每个线程有独立的运行栈和程序计数器,线程间的切换开销较小。所处环境:操作系统中可以同时开启多个进程,(可以理解为开启一个app),而一个进程中可以同时开启多个线程(可以理解为在一个app中一...原创 2019-08-04 19:50:55 · 148 阅读 · 0 评论 -
JVM加载class文件的原理机制;双亲委派模型
由于Java是一种动态解释型语言,所以class只有被加载到JVM中后才能运行。运行一个程序,JVM将编译生成的.class文件按照一定的需求和规则加载到内存中,并组织成为一个完整的Java应用程序。而加载的过程是类加载器完成的,类加载器本身也是一个类,实质就是把类文件从硬盘读取到内存中。类的加载方式:1.隐式加载:new操作创建对象时会隐式调用类加载器将类加载到JVM中,2.显示加载:通过直...原创 2019-08-01 15:51:23 · 369 阅读 · 0 评论 -
Java实现死锁
死锁的实现一个线程等待另一个线程执行完毕后才可以继续执行,但如果现在相关的线程彼此都在等待着,那么就会造成死锁。一定要注意对资源的上锁不要成“环”。避免死锁:1.按照顺序加锁,但是这种方式必须要事先知道你所要用到的所有锁并且要对这些锁排序。不是很常用,因为一般无法预知。2.加锁时限:在尝试获取锁的时候加一个超时时间,超过这个时间就放弃。但是Java中不能对synchronized同步块设...原创 2019-07-27 21:58:08 · 217 阅读 · 0 评论 -
基于Socket实现的局域网多线程聊天室
项目功能:使用线程池创建多个线程,一个线程就是一个客户端的连接;客户端能够实现注册、群聊、私聊以及退出的功能;服务器端用Map保存多个客户端和消息;群聊就是将map集合遍历,将消息发送给每个客户端(把Map转为Set,取得迭代器,取得每个实体)私聊就是取得对应的socket退出使用迭代器移除项目技术栈:Java I/O;线程池;类集的使用;Java基础知识的应用项目源码:Hea...原创 2019-07-31 21:50:32 · 614 阅读 · 0 评论 -
深入理解多线程:ThreadLocal
ThreadLoacal:线程内局部变量,对于一个相同的代码模块,每个线程访问的时候代码模块内的变量互不干扰,互不影响。相当于为每个线程创建一个单独变量的副本,相当于private static类型变量。在多线程中保证各个线程里的变量独立于其他线程的变量。目的是解决变量在单个线程内部变量的传递问题,ThreadLocal修饰的变量多个线程之间不共享,不存在安全性问题,所以它并不是解决多线程之间的...原创 2019-08-04 22:13:21 · 260 阅读 · 0 评论 -
性能测试框架
项目名称:Survival_of_fittest 性能测试框架项目背景:排序是我们常用的算法,并且有多种排序的实现,而真正的特定情况下那种排序方式更胜一筹我们应该通过实践数据来说明;快排的优化有很多种;到底那种更快?自己写的算法和系统提供的算法的速度差多少?这些都可以设计一个性能测试的框架来帮我们测试,通过测试结果也能很好地激励我们去优化他们。项目技术栈:反射的使用;反射获取一个类对象...原创 2019-07-31 19:25:55 · 323 阅读 · 0 评论 -
小型网上超市购物项目
项目功能:用户验证登陆(用户需要特定用户名和密码登陆才能进行购物)商品的增删改查商品加入购物车、在订单上商品的修改(加购物车和修改因为关系到新商品品加入订单,因此要判断商品货架集合中是否有该商品)删除订单上的商品对订单的下载(订单下载的清单里计算出整个订单的金额)能退回菜单栏订单的取消项目功能验证:项目总结:通过所学的Java集合框架、I/O以及其他基础知识来完成这个项目...原创 2019-07-31 15:34:17 · 633 阅读 · 0 评论 -
Java单例设计模式
单例设计模式(任何类的对象有且只有一个,一个类允许产生一个实例化对象)懒汉式和饿汉式首先控制对象的产生数量:将构造方法私有化(从源头上控制对象产生数量)类构造私有化:任何其他类均无法产生。唯一的类的对象产生于类内部;唯一的属性为静态属性,并且类中提供静态方法取得此对象package test;class Singleton{public void print(){System.out....原创 2019-05-13 16:14:14 · 148 阅读 · 1 评论 -
Java模板设计模式
模板设计模式:在编写代码时,要经常检查代码是否有问题,开闭原则是我们最常见最基本的原则。开闭原则(OCP):一个软件实体;比如类、模块、函数等,应该对扩展开放,对修改关闭。设计模式的关键在于第三方的解耦操作;接触设计模式,首先找到第三方;模板设计模式的第三方就是模板类。模板方法定义了一个算法的步骤,并允许子类为一个或者多个步骤提供具体实现。在方法中定义一个骨架,而将一些步骤延迟在子类中实现...原创 2019-05-11 20:16:23 · 131 阅读 · 0 评论 -
Set集合和迭代器输出
Set集合(不允许数据重复) 1.3.1 HashSet(无序存储)底层使用哈希表+红黑树,允许存放空值 1.3.2 TreeSet(有序存储)底层使用红黑树,不允许出现空值(NullPointerException) 要想将自定义类保存到TreeSet中,要么实现Comparable接口,要么向TreeSet中传入比较器(Comparato...原创 2019-04-26 14:55:42 · 1524 阅读 · 0 评论 -
collection里的List
Java类集实际上去就是java对数据结构的一种实现;---java.util1. Collection接口(单个对象保存的最顶层父接口) Collection接口以及其子接口在每次进行数据结构操作时只能对单个对象进行处理; 只定义了存储数据的标准,但是无法区分存储类型。 所以常用的是他的两个子类:List和Set public interface Colle...原创 2019-04-26 14:54:22 · 314 阅读 · 0 评论 -
接口
接口的使用限制*****接口中只允许public权限(不管是属性还是方法,其权限都是public)即便不写也是public在以后编写接口的时候,大部分接口只提供抽象方法,很少在接口里提供全局变量。阿里编码规范:接口中的方法和属性不要加任何修饰符号,public也不要加,保持代码的简洁性。抽象类中的方法前面的abstract不能省略,否则就是普通方法一个抽象类可以使用implements实...原创 2019-01-11 20:52:05 · 98 阅读 · 2 评论 -
小心得
JavaSE面向对象才接触Java的时候就老听到面向对象这四个字,了解后才知道,面向过程语言的代码可重用性太差。面向对象有很好的封装性,对代码有很好的保护作用,内部操作对外部而言不可见。也有良好的继承性,继承就是它可以实现所有类的功能,可以不用编写原来的类对这些功能进行扩展。继承性就是可重用性的体现。Java也存在良好的多态机制,可以使具有不同内部结构的对象可以共享相同的外部接口(利用多态性可以...原创 2018-12-25 11:21:32 · 95 阅读 · 0 评论 -
内部类
内部类就是在一个类的内部进行其他类结构的嵌套的操作。内部类破坏了程序的结构,但可以方便的操作外部类的私有访问(内部类可直接访问外部类的私有属性)内部类方法可以访问该类定义所在私有域中的数据(外部类的所有数据),包括被private修饰的私有数据内部类可以对同一包中的其他类隐藏起来 比如人和心脏,车与发动机(体现了内部类的封装特点)内部类可以实现java单继承的缺陷(可实现多继承的概念)内部...原创 2019-01-04 14:58:30 · 98 阅读 · 0 评论 -
数组与方法
数组与方法的互操作1)方法接收数组(多个栈内存指向同一个堆内存 ,方法中的形参在栈上开辟新空间)2)方法返回数组(要注意定义有一个返回数组的方法时,返回值为数组 eg:public static int[] init())3) 方法修改数组(因为数组上发生了引用传递,所以方法在接收数组后也可以修改数组)Java可以实现数组排序(基本数据类型数组都可以排序)java.util.Array.sor...原创 2018-12-13 20:23:42 · 156 阅读 · 0 评论 -
JavaSE分支和循环结构
Java分支结构if(使用if、else可以实现对条件的判断,但如果进行多值判断,可以使用switch语句)switch 可传变量(int char enum String)switch语句中每个case都要break!!!if 与 switch 的区别switch适合用在固定值,不能进行逻辑判断,而if适合使用逻辑判断,而且 if里面的内容丰富且多样可以是String、数值类型等循...原创 2018-12-06 12:22:39 · 128 阅读 · 0 评论 -
工厂设计模式
工厂设计模式*****1)简单工厂模式 第三方:一个具体的工厂类,将客户端中的new操作解耦到工厂类中,将类的实例化交给工厂易于解耦。优点:简单易于实现、将类的实例化操作解耦到工厂中,无需修改客户端缺点:违反OCP原则,每当产生新商品都要修改其工厂代码,后续结合反射机制来解决组成:一个抽象的产品接口(类)多个具体产品类一个工厂(生产所有商品)【无隐私无封装性】2)工厂方法模式:定义...原创 2019-01-13 10:09:23 · 93 阅读 · 0 评论 -
io流
字节流与字符流1.输入流与输出流 1.1 字节操作流(原生操作,无需转换) 1.1.1字节输出流(OutputStream) public abstract class OutputStream implements Closeable,Flushable; 是一个抽象类,要想为父类实例化对象就必须要使用子类...原创 2019-04-26 14:51:34 · 80 阅读 · 0 评论 -
Collection类集
类集实际上就属于动态对象数组。(当元素个数达到最大值时,动态增加容量)解决数组定长问题。Java类集实际上去就是java对数据结构的一种实现;---java.util1. Collection接口(单个对象保存的最顶层父接口)Collection接口以及其子接口在每次进行数据结构操作时只能对单个对象进行处理;只定义了存储数据的标准,但是无法区分存储类型。所以常用的是他的两个子类:List和Setp...原创 2019-04-12 12:52:35 · 190 阅读 · 0 评论 -
包
包的定义:在.java文件首行用package 包名称;package czy.joyce.java;public class Day16{public static void main(String[] args){System.out.println(“hello yida”);}}在JDK编译时:打包编译命令:javac -d(空格).(空格)类.java编译完成后会发现自动...原创 2019-01-21 09:29:25 · 146 阅读 · 0 评论