自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 资源 (2)
  • 收藏
  • 关注

原创 JUC#线程池加锁逻辑梳理

线程池的底层原理和源码解读,主要是对线程池中加锁逻辑的梳理

2023-07-05 23:50:02 217

转载 git失败的几种场景

参考前辈的博客总结:fatal: unable to access ‘https://github.com/…‘的解决办法 - 程序新视界

2021-12-24 20:34:52 219

原创 spring下载问题总结

FAILURE: Build failed with an exception.* Where:Build file 'E:\�о���\ѧϰ\springԴ��\spring-aspects\spring-aspects.gradle' line: 11* What went wrong:A problem occurred evaluating project ':spring-aspects'.> Could not resolve all dependencies for co.

2021-11-17 22:14:29 2781

转载 git提交或克隆报错fatal: unable to access ‘https://github.com/tata20191003/autowrite.git/‘: Failed to connec

解决方案:git提交或克隆报错fatal: unable to access ‘https://github.com/tata20191003/autowrite.git/‘: Failed to connec_good_good_xiu的博客-CSDN博客

2021-11-17 12:03:08 719

原创 Jarlauncher的实现原理

1、Jarlauncher的作用 JarLauncher作为引导类,当执行java -jar命令时,/META-INF/资源的Main-Class属性调用main(String[] args)方法,而实际上调用的是Jarlauncher#launch(args)方法。Jarlauncher作为jar的启动类用于装载项目引导类并添加其依赖,其所在的JAR文件的MavenGAV信息为org.springframework.boot:spring-boot-loader:2.0....

2021-11-09 21:52:32 2506

原创 创建spring boot 应用的两种方式

1、通过idea方式创建1)打开Idea并通过file-->new -->project方式创建一个项目2)选择Maven项目,选择java版本jdk8.0及以上版本,然后点击next3)设置自己应用的名字和应用版本号以及文件的位置信息,并点击finish方式后完成应用的创建2、通过图形化界面创建spring boot应用1)进入网站:https://start.spring.io2)选择建立一个Maven应用,然后根据需求选择spring boot...

2021-11-08 15:51:55 171

原创 spring boot编程思想思考笔记一——第一章

——在快速读完整本书后开始第二遍带着思考的方式和目前对该技术的有限认知再进行阅读来加深自己的理解第一章:对spring boot的理解在 《spring boot编程思想》中提到“spring boot 为快速启动且最小化配置的Spring应用而设计,并通过固化的视图的方式用于构建生产级别的应用”。结合后面提到的技术我认为spring boot就是1、通过基于注解的编程方式和外部化配置的方式来代替接口式的编程方式,从而达到简化配置的目的。2、固化的视图就是...

2021-11-07 22:05:01 429

原创 多线程----interrupt、interrupted、isInterrupted

java的多线程中断方式是interrupt该方法没有被static修饰是一个运行时方法,被用来中断指定的线程,使用方式也简单,在线程对象后面直接调用该方法就行比如说MyThread2 thread = new MyThread2();thread.start();Thread.sleep(10);thread.interrupt();下面来详细的分析一下源码的中断原理 public void interrupt() { if (this != Thread.cur

2021-10-15 18:24:25 163

原创 设计模式----建造者模式

建造者模式解决的是在属性较多时构造对象繁琐的问题。public abstract class Product { private String cpu; private String memory; private String DisplayCard; protected List<String> parts = new ArrayList<>(); public void add(String part){ pa

2021-10-11 23:18:17 63

原创 设计模式----代理模式

GoF中的代理模式定义:代理模式给某一个对象提供一个代理或者占位符,并由代理对象来控制对原对象的访问,属于结构型模式。在实现形式上分为两种静态代理和动态代理。设计动机由于跨越网络、或者安全方面的原因,不能直接或者不需要直接被访问,直接访问的代价会给系统带来不必要的复杂性,如可能会导致访问延迟、运行效率低下等问题,通过引入一个代理对象代替目标对象完成客户端程序对目标对象的各种操作要求,从而实现目标对象与客户端以透明的方式进行交互。按照功能可以分为远程代理、虚拟代理、保护代理、缓冲代理、智能引用

2021-10-09 09:38:18 122

原创 设计模式----组合模式

组合模式属于对象的结构型模型,他将对象组织到树形结构中,用来描述整体和部分的关系。Gof给的定义:组合模式组合成多个对象形成树形结构表示整体-部分的结构层次。组合模式将单个对象和组合对象(容器对象)的使用具有一致性解决的问题:针对客户端代码过多依赖于容器对象内部的复杂结构,如果容器对象内部结构发生改变,则客户端代码也需要过多的修改,从而导致代码维护性差、扩展性差等弊端。应用场景:当需求中体现的是部分与整体层次的结构时,以及希望用户代码忽略组合对象与单个对象的不同,统一使用组合结构中的所有

2021-10-07 23:05:29 51

原创 设计模式----观察者模式

观察者模式定义了对象间一对多的关系,当一个对象状态变化时,所有依赖它的对象都得到通知并将做出相应的反应。Gof中的定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,是他们能够自动更新。应用场景:1、监听器2、SpringAOP切面3、hook4、callback观察者UML类图如下源事件(source)源事件提供一个接口用来注册、删除、通知观察者角色,可以用一个抽象类或者接口来实.

2021-10-07 19:17:25 55

原创 设计模式----装饰者模式

装饰者模式是对客户透明的方式,动态的给对象附加更多的功能和责任,就是不用创建更多的子类的情况下就可以将对象的功能进行扩展。优点:避免了子类爆炸的问题,解决了对于一个产品功能动态扩展的问题,其UML类图如下所示构成:1、抽象构件(Component)定义对象的接口,用来给对象增加新的功能2、具体构件(ConcreteComponent)定义具体的构件对象,实现了抽象构件中声明的方法,是被装饰的对象,也是给这个对象添加新的功能3、抽象装饰器(Decorator)抽象装饰器是.

2021-10-06 21:02:05 173

原创 设计模式----中介者模式(调停者模式)

对于一个模块,可能由多个对象构成,而且这些对象之间可能存在相互的引用,如下图所示:为了减少对象之间复杂的引用关系,降低系统的耦合度,因此引出了中介者模式,也是中介者模式创建的动机。GoF给出的定义:中介者模式就是用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示的相互引用,从而使其耦合松散,从而可以独立地改变他们之间的交互。中介者模式是一种对对象之间的关系进行封装,是一种对象行为型模式,这样设计可以使各个对象在不需要知道其他对象的具体信息情况下通过中介者对象来与之通信。.

2021-10-06 17:04:56 122

原创 并发编程八----Executor框架的作用

Executor是一个多线程管理框架,创建线程的方式有三种Thread、Runnable、Callable。但是如果用这三种方式创建线程则存在线程的生命周期管理困难,无限创建线程的话还会存在资源消耗(内存消耗高)、线程生命周期的开销过高(cpu计算资源的消耗)、系统稳定性问题(不同系统创建线程的数量限制不同包括JVM的启动参数、Thread构造函数请求的栈大小、底层操作系统对线程数量的限制)。Executor是一个基于生产者和消费者模式的接口。主要做了以下几件事:1、为灵活和强大的异步任务执行框架提

2021-10-06 10:56:14 519

原创 设计模式----抽象工厂模式

工厂方法是具体工厂负责生产具体的产品,每个工厂都负责一种产品,而这些产品都属于同一类。抽象工厂和工厂方法的区别是抽象工厂又对所有类别的工厂进行了封装,可以生产一族产品,如下图所示生产手机和笔记本电脑两种物品1、建立一个抽象工厂,包含多个抽象类别public interface AbstractFactory { MobilePhone getMobilePhone(); Laptop getLaptop();}2、建立对应的抽象类public abstract c

2021-10-06 00:09:46 66

原创 设计模式----工厂方法

工厂方法这种设计模式在简单工厂模式上进行了改进,主要解决的是方便增加属于同一类的新的产品。工厂方法是由四部分组成的:1、抽象产品(对具体产品进行封装)2、抽象工厂(对具体工厂进行封装)3、具体产品4、具体产品工厂简单工厂是将实例化对象的工作推迟到一个专门负责创建对象的工厂类中,但是这是在我们预知的情况下可以动态的创建新的产品,所以存在产品类别量的局限性。但是预知的产品类量有限,对于无法预知的类就违背了“对扩展开放,对修改封闭的原则”。问题:具体工厂类创建工作无法满足我们的需.

2021-10-05 16:51:39 79

原创 工厂模式之简单工厂

简单工厂的构成分为三部分:1、抽象工厂2、具体工厂3、实体类举例:用工厂模式实现三种发送信息的方式:邮件、短信、微信;首先建立一个抽象工厂:public interface Sender{ void send();}第二步:建立三个具体类public class EmailSender implments Sender{ public void send(){ System.out.print("send a email");

2021-10-05 16:03:43 104

原创 四种单例模式的实现

1、懒汉式:public class Singleton01{ private static final INSTANCE = new Singleton01(); private Singleton01(){}; public static Singleton getInstance(){ return INSTANCE; } }2、线程安全的饿汉式public class Singleton02{

2021-10-04 20:14:34 51

原创 策略模式编程练习

策略模式是多态的一种很好的体现,通过设计一个策略接口,然后根据具体的算法策略执行具体的逻辑,这里体现的是面向对象的开闭原则,对修改封闭,对扩展开放,其最大的好处是拥有良好的扩展性。包含三个部分:抽象策略,具体的策略实现,策略调用环境下面通过售卖电影票练习来说明有三种优惠,优惠方式如下:1、学生8折2、儿童减10块3、会员半价首先建立一个抽象的折扣策略public interface DisCountStrategy { double discount(double

2021-10-04 19:56:24 162

原创 并发编程基础七----对象的组合保证线程安全性

设计线程安全类的三个基本要素:1、构成对象状态的所有变量;2、约束状态变量的不变性条件;3、建立对象状态的并发访问管理策略在设计线程安全类需要对整个程序进行安全分析以判断每个类是否是安全的,这样难以确保其是线程安全的。为了提高线程安全的分析效率可以使用封装技术对多个对象(包括线程安全的和非线程安全对象)进行封装,这样只要封装类的对象是线程安全的就可以确保多个线程可以安全的访问被封装的所有资源。要设计一个线程安全的类首先要分析以下几点:1、构成该对象的状态,哪些是可变的哪些是不可变的?

2021-09-27 22:22:53 102

原创 并发编程基础六----安全的发布一个对象

安全发布一个对象有4中常用的模式1、将一个对象的引用存放在一个静态变量中或者放在静态初始化函数中,存放在static修饰的变量中2、将对象的引用存放在volatile类型的域或者AtomicReference对象中3、将对象的引用存放在某个正确构造对象的final变量中(就是将对象的引用存放在final变量域中)4、将对象的引用用锁来保护,比如将对象的引用存放在安全的集合中(currentHashmap、Hashtable)5、对于不可变对象,由于其本身就是线程安全的,因此可以用任何一种

2021-09-23 23:38:40 53

原创 并发编程基础五----构造并发布正确的对象

前面讲了通过同步的方式可以安全的访问共享状态,并讲述了同步的几种方式。接下来两个内容将对《JAVA并发编程实战》中第三章对象的共享进行总结。该部分主要包含以下几个部分:1、安全对象的定义2、构建安全对象的几种方式3、安全发布的几种方式4、对象逸出(如何避免)...

2021-09-23 22:51:55 57

原创 并发基础四--活跃性和性能

安全性和活跃性关注的目标不同安全性是保证永远不会发生糟糕的事情,而活跃性关注的是最终一定会发生正确的事情。当某个操作无法继续执行时就会发生活跃性问题,包括:死锁,饥饿,活锁。死锁:两个线程都占用一定的资源且都在等待对方释放资源而无法继续执行的情况就称之为死锁。饥饿:在存在优先级的多线程时,会出现抢占,而优先级较低的线程可能一致无法获取到资源从而导致饥饿。活锁:指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,

2021-09-19 00:01:29 117

原创 并发编程三----子类加锁和父类加锁锁住同一个对象问题

首先创建一个父类class widget{ public synchronized void doSomething(){ System.out.println("widget: " + this); }}创建第一个子类,并在子类中重写父类中的方法并调用父类的方法class son1 extends widget{ @Override public synchronized void doSomething() { Syst

2021-09-18 20:42:06 384

原创 并发编程基础二----锁保护状态

锁可以保护代码路径以串行的方式访问共享状态的独占访问。共享状态包含原子变量和对象的共享状态。 对共享状态的保护有两种方式:加锁或者使用原子类。其中原子类是为了提高效率实现原子变量的并发安全访问实现。其实现原理是通过魔法类来实现的,如下图所示。 /** * Atomically sets to the given value and returns the old value. * * @param newValue the new val...

2021-09-18 20:18:21 234

原创 并发编程基础一----并发安全性

什么是并发?并发是在同一个时间段内,同时可以处理多个事件,从而提高资源的利用率;并通过不同粒度的时间分片以保证通过用户和程序在不同的时间段内可以享有计算机上的资源的使用权;并使每个程序只执行一个任务,且只在必要时进行通信,从而简化编程。多线程的优势多线程可以有效的降低程序的开发和维护成本...

2021-09-18 13:53:25 258

原创 如何看待反射机制与面向对象中的封装性

学习尚硅谷笔记:1.疑问1:有两种可以调用公共的结构:new的方式和反射的方式。解决方式:1.new的方式是在确定要造具体的类的对象时选择用,2.反射机制是在不确定要创建哪个类的对象时,使用,目前我的理解是反射机制和泛型一样是一个模板,主要体现在动态性(可以在服务器上理解这个技术)2.反射机制与面向对象中的封装性是不是矛盾的?如何看待两个技术?答: 不矛盾首先分析什么是面向对象的封装性,其主要体现是将属性和方法设置为私有的使其在其他类中调用时无法访问该类中内部的私有属性和私有方法。.

2020-09-22 15:43:49 494

原创 统计输入数字的个数:编写程序读取个数不定的整数,然后查找其中出现频率最高的数字

参考map的按值排序方法:https://blog.csdn.net/m0_37317159/article/details/100114954?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMac.

2020-07-27 10:31:50 1911

原创 java 之泛型知识点解答为了更好的理解泛型的作用

在JDK1.5后JAVA定义了泛型类、泛型方法、泛型接口,然后编译器会用具体的类型替换它。第一部分:使用泛型的动机和优点动机:采用泛型的主要原因是可以在编译期间检测错误,减少在运行期间发生错误的概率。优点:提高程序的可靠性和可读性举例程序:package java.langpublic interface Comparable<T>{public int compareTo(T o)}在这里需要知道这以下知识点:1、形式泛型类型;2、泛型实例化;3、泛型类型.

2020-07-22 20:11:01 233

原创 JAVA语言基础之I/O(这里先讲二进制I/O)

JAVA提供了很多进行文件输入输出的类,主要分为文本I/O类和二进制I/O类。先理解以下这两者之间的区别:文本文件和二进制文件文本文件是由字符的序列构成的,它存储的数据是以人能读懂的方式表示的,可以使用文本编辑器进行阅读,文件名的扩展名为。txt。二进制文件是由位的序列构成的,它存储的数据以二进制的形式表示,使用JVM阅读,二进制文件的优点就是比文本文件的效率更高。二进制文件与主机编码方案无关因此可移植。JAVA程序在任何机器上都可以访问Java程序创建的二进制文件,文件的扩展名为.dat。

2020-07-21 16:28:41 165

原创 更好的理解异常处理之间的关系

异常处理主要包括三部分:声明异常、抛出异常、捕获异常这三种处理关系和他们的名字一样。先声明异常才能抛出异常最后捕获到异常(这里指的异常都是必检异常)。在这里我觉得要理解的顺序是抛出异常、声明异常、捕获异常抛出异常是什么?抛出异常就是当程序检测到一个错误后创建一个适当类型异常的实例并告诉它的调用者(即抛出)这里需要注意发生了错误需要处理。比如在参数传递过程中如果给一个非负参数传递了一个负数值,这时就出现了错误可以创建一个IllegalArgumentException的实例并抛出来,因为只有抛出来

2020-07-21 09:49:10 114

原创 JAVA异常处理的三大操作

JAVA异常处理的操作分为三种:1、声明异常;2、抛出异常3、捕获异常第一种:声明异常 就是在java中,当执行的语句属于某种方法时,方法都必须说明他可能抛出的必检异常类型。例子: public void mymethod() throws Exception1,Exception2...关键字是throws需要跟下面的抛出异常的关键字(throw)区分开第二种:抛出异常 当程序查到一个错误后,创建一个适当类型异常的实例并抛出它。例:throw new IllegalArgumentEx

2020-07-20 14:52:42 1270

原创 java学习之异常处理(概念理解,了解处理步骤以及处理方式)

首先要知道,在编写Java程序时可能会出现的三种错误:1、语法错误;2、运行错误;3、逻辑错误语法错误:在编写程序过程中没有遵循编程语言的的规则出现的错误,这种错误一般会由IDE直接指出。运行错误:常见的就是编写完一个小项目以后IDE不提示错误,但是在运行过程中发现了一个不能执行的操作,就会导致运行错误逻辑错误:程序结果没有按照预期方案执行。异常处理的是运行错误,目的是为了避免程序非正常终止带来的严重问题。(可以想象以下在转帐时断网了你的钱转出了,但对方没有收到,钱也不在你的账户也不在对方账

2020-07-20 11:01:45 203

原创 点击鼠标使两个文本交替出现

采用的思想是用if else对二求余进行选择。显示文本选用label这样可以交替显示文本,或者使用repaint g.drawString不过设计相对会麻烦一些,可以自己进行尝试。package fourteen;import java.awt.*;import javax.swing.*;import java.awt.event.*;public class Exercise14_6 extends JFrame{ JLabel lab = new JLabel(); JP...

2020-07-18 13:54:24 318

原创 点击鼠标,显示鼠标的坐标,以及点击鼠标显示坐标,松开鼠标不显示坐标

package fourteen;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Exercise14_4 extends JFrame{ int x = 20; int y = 20; public Exercise14_4(){ coorPanel p = new coorPanel(); add(p); } publ...

2020-07-18 12:38:59 554

原创 事件驱动程序设计3

1、监听器一定是恰当的监听器接口的实例!!:因为这样是确保监听器能有正确处理该事件的正确方法。通过addXListener对监听器进行注册和实现(即监听器必须由源对象进行注册这需要根据具体的事件类型而定):例子:JButton jbtok = new JButton("ok"); ActionListener listener = new OKListener(); jbtok.addActionListener(listener)JButton组件...

2020-07-17 22:21:00 103

原创 创建一个用户界面,其上有OK和Cancel两个按钮以及一个显示消息的消息面板。点击OK按钮显示消息,点击Cancel按钮显示消息

采用的事件驱动程序的组件有:panel;Jlabel;JButton;JFrame;监听器addActionListener+Exercise14_3-JButton jbtok-JButton jbtCancel-JLabel lab(显示信息用)将按钮、标签加入到panel;设置文本对齐方式lab.setHorizontalAlignmentjbtok.addActionListenerjbtCancel.addActionListenerpackage fourte

2020-07-17 22:20:37 538

原创 事件驱动程序设计笔记2

知识要点:1、匿名内部类2、监听器适配器3、事件、(委托、注册、对象、源)4、事件监听器(包括监听器的接口)5、事件驱动程序设计事件类的根类在java.util.eventObject.EventObject的子类处理各种类型的事件(五大事件:行为、窗口、鼠标、键盘、组件),通过getSource()实例方法判断事件的源对象,而且对于组件如果一个组件能触发某个事件、则他的所有子类都能触发同类型的事件。监听器的对象的类必须实现相应的事件监听器接口。java语言为每种监听器都提供了.

2020-07-11 10:47:23 126

原创 事件驱动程序设计学习笔记1

要点:1、事件驱动程序设计的概念2、理解什么是事件、事件源、事件类3、声明监听器并理解事件的监听、注册和处理1、事件是程序发生了某些事情的信号,通常是外不用户行为,比如说点击按钮、移动鼠标、敲击键盘等,也有内部程序行为:比如定时器都是事件。程序可以有两种响应情况:1、忽略2、响应事件可以分为五类:1、行为事件;2、窗口事件;3、组件事件;4、鼠标事件;5、按键事件。需要注意的是:如果一个组件触发某个事件,组件的任意子类都可以触发同样类型的事件。例如GUI组件都可以触发以.

2020-07-08 23:32:10 360 1

图形比价总结.txt

学习java的基础知识,组件一章的学习笔记.。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

2020-07-04

按钮上画图形总结.docx

针对java语言学习的笔记总结,对于初学者学习到图形一章时的课后习题的完成情况和学习心得。希望对跟自己一样的新手有一些帮助

2020-07-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除