自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 使用Java RMI 和zookeeper实现RPC框架

今天给大家带来一个实战操作,使用java自带的RMI和zookeeper来实现一个RPC框架。通过本文,你可以学习RMI和zookeeper的一些相关知识。1 JAVA RMI什么是JAVA RMI呢,我们知道RPC是远程过程调用,而RMI(Remote Method Invocation)远程方法调用,RMI 是从 JDK1.2 推出的功能,它可以实现在一个 Java 应用中可以像调用本地方法一样调用另一个服务器中 Java 应用(JVM)中的内容。听起来是不是很厉害,下面我们先来介绍一下JAVA R

2021-03-03 21:26:15 268 1

原创 Vue报错并解决。TypeError: Cannot read property ‘setAttribute‘ or ‘getAttribute‘ of null

js TypeError: Cannot read property 'setAttribute' or 'getAttribute' of null问题描述问题分析问题解决问题描述控制台打印该错误:TypeError: Cannot read property ‘setAttribute’ of null问题分析该错误主要是因为调用的时候,该组件还未初始化完成,所以导致获取不了dom元素window.tinymce.activeEditor.getBody().setAttribute('c

2020-12-09 14:41:31 5162

原创 多线程设计模式之Future 设计模式

Future 设计模式就好像我们在发送ajax请求一样,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容。这个图就很清楚的讲清楚了这个模式,当客户端发送数据过去,服务端会进行处理,但是为了保证用户体验,用户可以进行其他操作,当用户需要该数据的时候,进行请求即可,这种模式适用于有很多数据需要处理的时候,可以让后台去处理,我们可以进行自己想要的操作。完整代码如下:请求的数据对象接口:public interface Data { String getReque

2020-10-21 21:18:09 211

原创 多线程设计模式之Single Thread Execution 设计模式——机场过安检

Single Thread Execution 模式是指在同一时刻只能有一个线程去访问共享资源,就像独木桥一样每次只允许一人通行,简单来说, Single Thread Execution 就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。下面我们以机场过安检进行该模式的讲解:机场过安检先模拟一个非线程安全的安检口类,旅客(线程)分别手持登机牌和身份证接受工作人员的检查,示例代码如下所示。public class FlightSecurity { private int cou

2020-10-19 19:45:11 279

原创 并发 Queue,ConcurrentLinkedQueue,BlockingQueue,PriorityBlockingQueue,DelayQueue

在并发队列上 JDK 提供了两套实现,一个是以 ConcurrentLinkedQueue 为代表的高性能队列,一个是以 BlockingQueue 接口为代表的阻塞队列,无论哪种都继承自 Queue。ConcurrentLinkedQueue这是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能, 通常 ConcurrentLinkedQueue 性能好于 BlockingQueue。它是一个基于链接节点的无界 线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最

2020-10-18 09:22:49 207 1

原创 同步类容器和并发类容器

**同步类容器**同步类容器都是线程安全的,同步容器类包括 Vector 和 HashTable,二者都是早期 JDK 的一部分,此外还包括在 JDK1.2 当中添加的一些功能相似的类,这些同步的封装类是由 Collections.synchronizedXxx 等工厂方法创建的。 但在某些场景下可能需要加锁来保护复合操作。复合类操作如:迭代(反复访问元素, 遍历完容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这些复合操作在多线程并发地修改容器时,可能会表现出意外的

2020-10-17 20:39:44 89

原创 简单讲解ThreadLocal

Threadlocal 概念线程局部变量,是一种多线程间并发访问变量的解决方案。与其 synchronized 等加锁的方式不同, ThreadLocal 完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。从性能上说, ThreadLocal 不具有绝对的优势,在并发不是很高的时候,加锁的性能会更好,但作为一套与锁完全无关的线程安全解决方案,在高并发量或者竞争激烈的场景, 使用 ThreadLocal 可以在一定程度上减少锁竞争。public class Conn

2020-10-16 21:17:31 85

原创 模拟阻塞 Queue

BlockingQueue 即阻塞队列,它是基于 ReentrantLock,依据它的基本原理,我们可以实现 Web 中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示:在 Java 中,BlockingQueue是一个接口,它的实现类有 ArrayBlockingQueue、 DelayQueue 、 LinkedBlockingDeque 、 LinkedBlockingQueue 、 PriorityBlockingQueue、SynchronousQueue 等,它

2020-10-15 21:04:50 213 2

原创 volatile关键字的用法

volatile 关键字的概念volatile 概念:volatile 关键字的主要作用是使变量在多个线程间可见。public class VolatileDemo extends Thread { private volatile boolean isRunning = true; private void setRunning(boolean isRunning) { this.isRunning = isRunning; } @Overrid

2020-10-14 21:08:16 212

原创 设计模式之代理模式-动态代理

jdk动态代理:我先给代码,最后会总结:先定义一个接口:租房:public interface JdkProxyRent { void renting();}可以把下面的JdkProxyOldlu理解为房东,他现在有房子要出租,需要为它生成一个代理对象。public class JdkProxyOldlu implements JdkProxyRent { @Override public void renting() { System.out.pri

2020-10-12 22:31:31 65

原创 java 线程之间的通信-生产者消费者问题

线程间的通信线程间通信又称为进程内通信,多个线程实现互斥访问共享资源时会互相发送信号或等待信号,比如线程等待数据到来的通知,线程收到变量改变的信号等。1 单线程间通信1.1 初识 wait 和 notify假设我们现在需要两个线程,一个负责生产数据,一个负责消费数据,理想状态下我们希望一边生产一边消费。public class ProduceConsumerVersion { private final Object LOCK = new Object(); private int

2020-10-11 20:38:50 163 2

原创 浅谈synchronized锁对象

我们知道,多个线程争抢同一个 monitor 的 lock 会陷入阻塞进而达到数据同步、资源同步的目的,而大家可能比较疑惑,这个monitor到底是啥?this monitor在下面的代码 ThisMonitor 中,两个方法 methodl 和 method2 都被 synchronized 关键字修饰,启动了两个线程分别访问 method1 和 method2。public class ThisMonitor { public synchronized void method1() {

2020-10-10 20:39:25 391

原创 多线程之synchronized 关键字的用法

初识 synchronized 关键字synchronized 提供了一种排他机制,也就是在同一时间只能有一个线程执行某些操作。也就是说如果多个线程对index变量(共享变量/资源同时操作)而引起的数据不一致的问题,我们可以使用该关键字去解决。什么是 synchronized?synchronized 关键字可以实现一个简单的策略来防止线程干扰 和内存一致性错误,如果一个对象对多个线程是可见的,那么对该对象的所有读或者写都将通过同步的方式来进行。synchronized 关键字的用法synchro

2020-10-09 21:46:34 282

原创 join方法应用之—查询航班信息

哈喽,小伙伴们,大家好。本章节继续分享join应用,希望大家有所收获。好了,废话不多说,进入正题。需求:假设一个软件,需要实现这样一个功能,主要用于查询航班信息,你的软件没有这些实时数据的,所以当用户发起查询请求时,你需要到各大航空公司的接口获取信息,最后统一整理加工返回到客户端。需求大概如下图:分析:其实功能很简单,就是我们输入起始地址,然后去查询每一家航空公司的航班信息,返回给我们,我们处理之后,再返回给客户端。就是先串行然后并行然后串行,即串行任务局部并行。第一步:定义一个接口/**

2020-10-08 15:21:20 669

原创 join方法应用之一——按顺序输出三个线程

哈喽,小伙伴们,大家好。今天给大家分享的是join方法的应用。因为join方法比较重要,所以就实际应用一下。当然,该程序主要是为了讲解join的作用。所以比较简单。好了 ,废话不多说,直奔主题。题目按顺序执行三个线程。比如A线程和B线程和C线程,这三个线程执行之后,输出ABC。分析我们首先要清楚join这个方法,不清楚的,可以去我的另外一篇博客查看。Thread重要的API—下—join方法,他的作用是join 某个线程 A,会使当前线程 B 进入等待,直到线程 A 结束生命周期,或者到达给定的时

2020-10-08 11:26:39 467

原创 java-Thread重要的API—下—join方法

哈喽,小伙伴们,大家好。今天给大家分享的是线程的join方法,这个方法很重要,利用这个方法,你可以实现很多比较强大的功能。好了,废话少说一点,进入正题。Thread 的 join 方法是一个非常重要的方法,使用它的特性可以实现很多比较强大的功能,Thread 的 API 为我们提供了三个不同的 join 方法。public final void join() throws InterruptedExceptionpublic final void join (long millis) throws

2020-10-07 21:07:18 113

原创 java-Thread重要的API—上—interrupt,isInterrupted,interrupted三者的区别和使用

小伙伴们,大家好。今天给大家分享的是Thread里面重要的API之interrupt方法。给大家讲解一下interrupt,isInterrupted,interrupted这三个方法的区别和使用。好的,废话不多说,进入正题!1 interrupt方法如果一个线程处于阻塞状态,若另外的一个线程调用被阻塞线程的 interrupt 方法,则会打断这种阻塞。但是,打断一个线程并不等于该线程的生命周期结束,仅仅是打断了当前线程的阻塞状态。public class ThreadInterrupt {

2020-10-06 16:05:12 267

原创 java-Thread重要的API—上—sleep(),yield(),setPriority()以及sleep(0)的妙用。

哈喽,小伙伴们,大家好!今天给大家分享的是Thread里面重要的方法,为了便于大家掌握,我分为三部分进行讲解,首先是第一部分,这些方法是在开发中比较常用的API,常用的和不常用的,我都会给大家提示,希望大家都有所收获,好了,进入正题。1 sleep()方法(常用)sleep 是一个静态方法,其有两个重载方法,其中一个需要传入毫秒数,另外一个既需 要毫秒数也需要纳秒数。1.1 方法介绍以及实现sleep 方法会使当前线程进入指定毫秒数的休眠,暂停执行,虽然给定了一个休眠的时间, 但是最终要以系统的定时

2020-10-05 21:14:20 537 2

原创 java-守护线程的三个为什么?

本博文主要是为了解释三个问题:第一,什么是守护线程?第二,为什么要有守护线程?第三何时需要守护线程?1 什么是守护线程public class DaemonThread { private static int counter = 0; public static void main(String[] args) throws InterruptedException { // 创建子线程 Thread t1 = new Thre

2020-10-04 19:26:40 271

原创 java-线程的命名方式以及线程的父子关系

1 线程的命名我们构造线程的时候可以为线程起一个有特殊意义的名字,这也是比较好的一种做法,尤其在线程比较多的程序中,为线程赋予一个包含特殊意义的名字有助于问题的排查和线程的跟踪。1.1 线程的默认命名Thread()Thread (Runnable target)Thread (ThreadGroup group,Runnable target)下面的几个构造函数,并没有提供为线程命名的参数,那么此时线程会有一个默认的命名。1.2 打开 JDK 的源码会看到下面的代码:/*** Allo

2020-10-04 13:49:31 648

原创 设计模式之代理模式—静态代理

1 什么是代理模式代理模式(Proxy Pattern):代理模式是 Java 常见的设计模式之一。所谓代理模式是指客 户端并不直接调用实际的对象,而是通过调用代理对象,来间接的调用实际的对象。比如中介。如下图2 为什么使用代理模式隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类 对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。开闭原则:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额 外的功能来扩展委托类的功能,

2020-10-03 15:55:02 166

原创 spring整合mybatis

Spring整合mybatis导入jar包1 导入mybatis相关的jar包mybatis-3.5.5.jarasm-7.1.jarcglib-3.3.0.jarcommons-logging-1.2.jarjavassist-3.27.0-GA.jarlog4j-1.2.17.jarlog4j-api-2.13.3.jarlog4j-core-2.13.3.jarognl-3.2.14.jarslf4j-api-1.7.30.jarslf4j-log4j12-1.7.30.j

2020-10-03 14:19:52 218

原创 java 创建线程的方式

Java创建线程的方式1 官方API里面的说法通过官方 API 可以发现创建线程的方式有两种,第一种是通过继承 Thread 类,重写 run 方法;第二种是通过实现 Runnable 接口,创建线程时传入该接口的子类。2 我的观点这种说法是不严谨的,Java 中代表线程的就只有 Thread 这个类,我们可以分析 start 方法源码,线程的执行单元就是 run 方法,你可以通过继承 Thread 然后重写 run 方法实现自己的业务逻辑,也可以实现 Runnable 接口实现自己的业务逻辑。ja

2020-10-02 15:18:53 1524 1

空空如也

空空如也

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

TA关注的人

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