java
文章平均质量分 88
丶丶路遥
这个作者很懒,什么都没留下…
展开
-
ActiveMQ之快速上手
JMS规范ActiveMQ遵循JMS规范,是实现JMS接口的消息中间件,其遵循如下规范。Provider(MessageProvider):生产者Consumer(MessageConsumer):消费者PTP:Point to Point,即点对点的消息模型Pub/Sub:Publish/Subscribe,即发布/订阅的消息模型Queue:队列目标,只对单个用户消费Topic:主...原创 2020-03-28 19:31:28 · 217 阅读 · 0 评论 -
二叉树的递归与非递归方式的先序、中序、后序、层序遍历算法(Java版本)
介绍本文提供了二叉树的构造、递归与非递归方式的遍历算法,其中递归方式较为简单。但在实际应用中,递归的遍历方式适用于递归深度不高的算法中,其一般使用非递归方式来解决。二叉树建树实验一:输入测试数据序列:A B # D # # C # #构造二叉树示意图:非递归遍历二叉树的原理递归方式遍历二叉树较为简单,本文不做过多描述。非递归方式需要用到栈作为辅助数据结构来实现,非递归遍历二叉...原创 2020-01-07 17:20:55 · 1979 阅读 · 0 评论 -
图的深度、广度优先、最小生成树、最短路径算法(Java版本)
介绍本文提供了图的邻接表、邻接矩阵的Java实现,包括深度优先算法、广度优先算法、prim算法和地杰斯特拉算法。原理分析输入图:深度优先遍历:广度优先遍历:注意:邻接矩阵和邻接表同样的输入遍历的结果可能会不完全一样,原因邻接表的构造并非将小编号的结点连接在靠前的位置,因此导致遍历结果和邻接矩阵不相同,但其在逻辑上仍然满足图的深度优先遍历。另外,最小生成树和最短路径当图中存在两...原创 2020-01-06 19:46:45 · 1264 阅读 · 1 评论 -
手写Jedis
简介Redis缓存技术常备作为互联网架构中的热点技术,常用来提升系统的性能,常被应用在一些读多写少的场景。Jedis基于Java实现,通过Jedis底层的协议,我们很简单就可以访问Redis服务器,如Redis中的Set、keys、get等命令。本文将简单模拟Jedis的实现。原理Redis使用RESP协议,其描述如下:Jedis协议地址验证:我们可以手写一个ServerSocket...原创 2019-11-13 22:04:07 · 179 阅读 · 0 评论 -
Java中的Semaphore
介绍Semaphore是Java提供的另一种锁机制,称为信号量,它可允许指定数量的多个线程同时拥有一个信号量。区别于锁的关键在于,锁是为了保证资源的安全而设计的,而信号量是为了限制资源的并发数,对性能进行考虑而设计。设计原理它通过维护一个计数器来限制访问的线程的数量,若增加一个线程的访问时,信号量减一,直到信号量为0时,则无法加入新的访问的线程,这些线程将等待信号量的增加,如大于0,则等待的...原创 2019-11-07 20:44:09 · 535 阅读 · 0 评论 -
一种安全高效的文件传输协议设计
介绍随着3G、4G、5G的发展,使得文件传输变得轻而易举,我们可以随时随地地进行文件传输,与好友之间,与云服务器之间。文件的传输,意味着一个数据信息需要在网络上暴露,当受到恶意攻击时,导致数据泄露,造成一些不可磨灭的灾难。因此,文件的安全传输是一个值得探讨的问题。1、加密技术,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已知的加密信息,但因不知解密的方法,仍然无法了解信息内...原创 2019-11-01 19:44:20 · 2171 阅读 · 4 评论 -
Java之偏向锁、轻量级锁、互斥锁
自旋锁 一般都是采用一个循环来占用某个资源,可想而知,它不适合对某个资源长期占用,采用循环会严重损耗CPU性能。CAS CAS即Compare and Set,即比较和设置的意思,它的核心思想是通过比较预期值和原值是否一样,如果不一样,则进行修改成预期,如果一样就返回false。Java里AtomicInteger.compareAndSet(int,int);就是典型的CA...原创 2018-08-18 11:19:46 · 320 阅读 · 0 评论 -
Java原子操作和volatile优化
系统总线 在介绍Java原子操作是如何实现之前,先来看下计算机组成中的系统总线。 https://blog.csdn.net/liujiuxiaoshitou/article/details/72800991 上面这张图描述的是单总线结构,这也是最简单的一种总线结构,我们发现CPU、主存、设备接口、都接在一根总线上面,这就导致,一个设置占用总线之后,其他设备无法在总线进...原创 2018-08-18 11:56:29 · 413 阅读 · 0 评论 -
一个简单排他锁的原理与实现
介绍本文将介绍如何应用AbstractQueuedSynchronizer实现一个简单的Lock锁。至于AbstractQueuedSynchronizer的原理在博主其他文章中有介绍,本文重点讲述其应用。AbstractQueuedSynchronizer使用一个队列维护所有的等待锁释放的线程,队列中的每个结点通过自旋的方式来争抢锁,当同步结点释放锁,唤醒next结点。在自旋中,该线程序判断当...原创 2019-04-26 12:58:57 · 2438 阅读 · 0 评论 -
java之CAS
java的synchronized是一种悲观锁,也就是说,一个线程占用某个资源,直到该线程释放资源。 java的CAS机制采用“无锁”机制,是一种乐观锁,他不采用锁策略,而是用一个值来判断当前资源是否被占用,内部采用自旋校验。 数据库中的行锁,select * from t_b where id = ? for update,其他线程不能对该行进行更新,删除,这种机制如果在高并发场景下,会严重...转载 2018-08-15 15:38:59 · 109 阅读 · 0 评论 -
Socket发送和接收解耦
为了将Socket的发送消息和接收消息解耦,笔者实现了一个简单的消息队列,这里重点是,发送队列为空的时候,要使发送线程休眠,接收队列为空的时候,要使读取Message的线程休眠。...原创 2018-08-10 11:15:42 · 550 阅读 · 0 评论 -
高并发--卷6--线程组、异常处理
为了更好的管理线程,JAVA中引入了线程组,我们将相同类型的线程放到线程组中。 new Thread(Thread,Runnable);引例public class T{ public static void main(String[] args) throws InterruptedException { ThreadGroup tg = ne...原创 2018-07-28 16:58:40 · 139 阅读 · 0 评论 -
高并发--卷4--读写锁
ReentrantLock锁的互斥性决定了同一时间内lock()下只能有一个线程在执行。 但是对于读和读的情况,却没必要让两个线程互斥,对于读写,写读,写写需要进行互斥,所以,JDK中提出了一种读写锁的机制,ReentrantReadWriteLock()读读 读读不会互斥。import java.util.concurrent.locks.ReentrantRea...原创 2018-07-22 14:39:28 · 168 阅读 · 0 评论 -
单例模式--静态内部类和静态代码块实现单例的区别
静态资源不是一开始就存在于内存中的。 我们来看一个例子,静态资源不是一开始就存在于内存中的。class A{ private A(){ System.out.println("A被初始化了"); } private static A a = new A();} 我们创建了一个类A,我们并没有使用这个类,在控制台,也不会输出:“A初...原创 2018-07-28 17:00:01 · 2022 阅读 · 0 评论 -
高并发--卷4--ReentrantLock扩展的API
前面介绍了基本的Condition.await(),Condition.signal(),Condition.signalAll(),Lock.lock(),Lock.unlock()等方法的使用,这里再介绍一些新的API。在线程池的设计中会起到一些作用。ReentrantLock.getHoldCount()获取当前Lock下lock()次数 该方法能获取到当前Lock调用了...原创 2018-07-20 00:46:28 · 301 阅读 · 0 评论 -
java.io.EOFException
问题描述笔者在Socket文件上传中,在文件写出完成之后,发现服务端抛出如下异常java.io.EOFException at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340) at java.io.DataInputStream.readUTF(DataInputStream.java:589) at...原创 2019-01-02 21:04:09 · 17335 阅读 · 0 评论 -
阿里消息队列RocketMQ简单部署
简介RocketMQ是阿里巴巴开源的消息队列,主要用作削峰,解耦,异步。本文主要讲如何部署阿里RocketMQ,具体概念请自行百度。可参考:https://www.jianshu.com/p/2838890f3284安装JDK安装1、安装JDK2、配置JDK环境变量3、安装RocketMQ4、配置RocketMQ环境变量主要安装过程为以上4步,下面附上linux上安装jdk的...原创 2019-03-16 21:04:14 · 1866 阅读 · 0 评论 -
一个简单的线程池的实现
介绍线程池技术是用来解决高并发,合理利用服务器资源的技术,另外线程池技术无需每次重新创建一个线程,提高了任务的执行效率。如同多线程异步发起请求。本文介绍一个简单线程池的实现,启用多个Worker(extends Runnable)线程,用一个任务(extends Runnable)队列来维护所有的任务,每执行一个任务,即在Worker中调用任务的run()方法即可。代码实现线程池抽象pu...原创 2019-04-03 23:49:39 · 332 阅读 · 1 评论 -
手写Dubbo
介绍Dubbo作为一种RPC框架,极大的提高了程序的开发效率,其底层采用NIO模型,因此其支持IO密集的RPC远程服务。本文剖析了Dubbo的实现了,首先了其核心部分的代码,主要有服务提供者,服务消费者,以及注册中心三个部分。底层采用Netty和Http两种通信协议,实现了类似真实Dubbo的一个简易版框架。本实验中Dubbo的三个组成部分事实上,Dubbo有4个组成部分,但是本实验为了简单...原创 2019-06-03 22:34:10 · 384 阅读 · 0 评论 -
Java闭锁
介绍一种常见的场景,当一个用户请求服务器,服务器为了响应,要进行一系列的操作,有可能需要去调用多个接口,等待各个接口返回结果,而各个接口之间相互独立,为了提高效率,一般会使用异步的方式。当所有异步线程都执行完毕后,通知主线程,主线程进一步执行下一步的逻辑,最终响应。那么主线程如何知道所有线程都完成了呢?本文介绍一种闭锁,让多个线程执行完后通知主线程,若未执行完,主线程阻塞,等待其执行完毕后再进行...原创 2019-05-07 23:10:57 · 1287 阅读 · 0 评论 -
netty之helloworld示例
介绍Netty是基于NIO,实现了对NIO的封装。netty常用来做RPC通信,对于传统的NIO而言,API的使用及其不便,在每次读写后都需要flip()操作才能保证整个字节数组的正确读写,因此Netty作者对此实现了封装,他希望netty用户专注于业务代码,而其余部分交给netty来实现。关于netty入门的代码在我的github上可以下载。Netty设计NIO单线程模型NIO线程池...原创 2019-05-20 10:54:44 · 658 阅读 · 1 评论 -
NIO
介绍在传统的Socket网络模型中,通常使用Blocking IO的形式进行读写,所谓的Blocking IO即BIO,实际上是一种阻塞IO模型。其模型可以概括为,在接收到另一端的数据之前,一直是阻塞状态以等待连接建立和数据接收,只有当连接建立完毕或接收到数据之后,才进一步进行操作,整个过程,线程一直被占用,浪费了大量的CPU资源。从而在JDK1.4之后,提出一种NIO(Non-bloking ...原创 2019-05-09 19:12:25 · 132 阅读 · 0 评论 -
Java闭锁2(Callable接口的模拟与应用)
介绍Java中一共有4种创建线程的方式,继承Thread、实现Runnable接口、实现Callable接口,通过线程池创建。在以上4种线程的创建方式中,如果你了解果前两种线程的创建方法,那我们是可以模拟实现Callable接口提供的功能的。它旨在通过异步操作之后,主线程能接收异步操作返回的值。笔者在之前的文章中介绍过什么是闭锁,以及如何模拟实现CountDownLatch闭锁,若不知道该内容的...原创 2019-05-08 10:57:25 · 214 阅读 · 0 评论 -
动态代理与注解(Spring IOC、AOP核心)
介绍Spring两大核心,IOC和AOP,其中都用到了动态代理,常用于日志记录,性能统计,安全控制,事物处理,异常处理等,主要将与业务无关的逻辑从代码中抽离出来复用,实现解耦。动态代理是在静态代理的基础上产生的,博主之前介绍过静态代理模式。静态代理模式对弊端是被代理对象需要实现其公共接口以及接口的所有方法。试想若在一个系统中要给所有对象的所有方法都加上日志记录,让所有代理对象都去实现其接口是不...原创 2019-04-28 23:56:44 · 1320 阅读 · 0 评论 -
实现一个简单的连接池
介绍数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池不仅避免了并发数过多导致连接数溢出的问题,而且能够有效的利用连接资源,对数据库的操作无需每次建立连接,只需从池中获取连接即可。代码实现(Java)...原创 2019-04-03 11:04:54 · 498 阅读 · 1 评论 -
Java常用正则表达式
常用正则表达式a 单独的字母就表示这个字母\\d 表示数字\\D 表示[^\\d]\\W 非[a-zA-Z0-9]\\w 表示[a-zA-Z0-9]的字母 相当于[^\\W]\\u 表示16进制字符/t 表示制表符/n 换行符/f 换页/e 转义字符[abc] 表示a|b|c[^abc] 除了a|b|c[a-zA-Z0-9] 表示a-z或A-Z或0-9中的一个字符[a-...原创 2019-03-23 19:03:40 · 227 阅读 · 0 评论 -
高并发--卷4--Lock的使用
在前面的几卷,主要介绍了使用synchronized关键字实现线程的同步,这一讲,我们介绍一种非java虚拟机自身提供的关键字,而是用ReentranLock类来实现,它在jdk1.5中被提出,用来解决synchronized解决不了的一些问题。比如使用synchronized关键字和wait和notifyAll的时候,notifyAll唤醒的是所有于synchronized锁对应的线程,这...原创 2018-07-19 22:55:28 · 175 阅读 · 0 评论 -
单例模式的三种写法
DCLpublic class T{ private volatile static T t = null; private T(){} static{ if(t == null){ synchronized (T.class) { if(t == null){ ...原创 2018-07-24 18:51:03 · 117 阅读 · 0 评论 -
高并发--卷3--ThreadLocal
在java并发编程中,经常用到ThreadLocal来保存一个变量的值,而且,不同线程直接存放的数据具有隔离性。ThreadLocal-set(T)/get() 通过set(T)和get()进行存值和取值,不同线程之间具有隔离性。public class T{ public static ThreadLocal<String> t原创 2018-07-11 21:45:46 · 145 阅读 · 0 评论 -
在Myeclipse 2015中安装使用Swing设计器
我自己手写swing是一件很麻烦的事情,但是幸运的是有人写了一个myeclipse的插件,叫做Windowbuilder安装WindowBuilder 第一步,打开Myeclipse,在上面的菜单栏中找到install from catalog,然后稍等窗口弹出 第二步,在catalog窗口中输入swing,就能看到windowBuilder 第三步,点击install,然后等待安装完成,原创 2018-04-24 01:46:24 · 2214 阅读 · 0 评论 -
Java快速入门--4--面向对象
java几乎是最好面向对象的语言了,和C++相比,你会感觉到java的面向对象部分是多么简洁。面向对象概念 在真实的世界里,不管是我们人,还是动物,还是机器,我们都可以称之为一个对象,他们都有共同的特点,这个特点是,他们都是一堆属性的集合,所以,我们把拥有一堆属性的集合体,称为一个对象。例如,人,可以有名字,可以有年龄,可以有性别等等属性,如果我们抽象出来,那么就是一个对象,在java中如何定原创 2018-03-26 20:40:38 · 185 阅读 · 0 评论 -
java快速入门--3
数组 在java中,任何类型都可以定义成数组类型。例如我们之前学过int类型,int arr[] = new int[10];同时,如果我们学了对象,可以定义对象数组,例如,Person p[] = new Person[10],int类型的数组,它会自动初始化成0,boolean类型的数组会自动初始化成false。//给数组赋值成0-9int arr[] = new int[...原创 2018-03-26 17:21:49 · 117 阅读 · 0 评论 -
Java SE快速入门--2
流程控制 java se中的流程控制,跟其C语言基本一样,这里先讲ifif_else if_elseif(条件){ //执行的内容}else if(条件){ //执行的内容}else{ //执行的内容} 如果条件成立则执行对应代码块中的内容,另外我们思考一下,如果将if elseif和else都换成if。if(条件){ //执行的内容}if(条件原创 2018-03-26 16:38:06 · 318 阅读 · 0 评论 -
Java SE快速入门--1
这里就不讲环境变量和安装了,这个按照百度上面的教程来就可以了。hello wordpublic class HelloWord{ public static void main(String args[]){ System.out.println("Hello Word"); }} 值得注意的是,args是命令行参数,我们在dos下...原创 2018-03-26 14:47:35 · 640 阅读 · 0 评论 -
java实现远程桌面
java实现远程桌面控制端将鼠标事件传递到服务端 服务端拿到鼠标事件之后传输到客户端 客户端拿到鼠标事件之后,通过robot类即可完成,并且截屏将图片发给服务器,服务器再发给控制端被我简化之后得到//先介绍一下robot类的简单使用import java.awt.AWTException;import java.awt.Robot;import java.awt.event.InputE原创 2017-11-24 10:31:08 · 14710 阅读 · 12 评论 -
7---------迪杰斯特拉算法的简单应用
使用迪杰斯特拉算法解决任意两点间的最短路径问题package list;import java.util.Scanner;/** * 稍微修改迪杰斯特拉算法即可得出结论 * 思路:从该结点出发,依次向外探测,并与修正与当前生成路径的最短路径 * @author 哑元 * */public class Test1 { public static void main(String[原创 2017-12-19 20:32:41 · 965 阅读 · 0 评论 -
八皇后问题
回溯法解决八皇后问题 八皇后问题,国际象棋是8x8的棋盘,其中皇后可以斜着走,竖着走,横着走,无距离限制 问:如果在这个棋盘上面摆满8个皇后,同时相互不被吃掉 public class QueenSort { static int count = 1; public static void main(String[] args) { int arr原创 2017-10-27 21:57:05 · 490 阅读 · 0 评论 -
手写单例模式
java单例之enum实现方式传统的两私有一公开(私有构造方法、私有静态实例(懒实例化/直接实例化)、公开的静态获取方法)涉及线程安全问题(即使有多重检查锁也可以通过反射破坏单例),目前最为安全的实现单例的方法是通过内部静态enum的方法来实现,因为JVM会保证enum不能被反射并且构造器方法只执行一次。实现方法如下:/** * 使用枚举的单例模式 *转载 2017-03-25 22:02:42 · 2154 阅读 · 0 评论 -
java中的枚举的几种用法
用法一:常量在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 Java代码 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:swi转载 2017-03-25 21:45:55 · 238 阅读 · 0 评论 -
单例模式的七中写法
转载请注明出处:http://cantellow.iteye.com/blog/838473http://blog.csdn.net/wolf_fang/article/details/52664218 第一种(懒汉,线程不安全): Java代码 public class Singleton { private static Singleton转载 2017-03-25 21:32:20 · 262 阅读 · 0 评论