自定义博客皮肤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)
  • 问答 (1)
  • 收藏
  • 关注

原创 并发和并行的关系

多CPU核心、多线程情形下,且各线程不操作共享数据,才能算并行。若是操作了共享数据,那必然任一时刻,只能有一个线程操作共享数据,其他线程会阻塞,那就是并发。若线程数量大于CPU核心数,且各线程不操作共享数据,那么并发和并行同时存在。所以并发和并行并不是对立的。

2024-09-05 00:28:20 118 1

原创 基于spring schedule、zookeeper和VUE实现的可视化分布式定时任务工具

自己用Java写了个可视化的定时任务工具,取名sundial(日晷)。定时任务的原理就是spring schedule;分布式锁基于zookeeper实现,客户端采用Netflix开源的Curator。JDK用的17,最新的长期支持版本(LTS),数据库是MySQL,同样是最新的MySQL8。囿于篇幅,下面只介绍主要的类和数据库设计。查看详细代码,请移步GitHub,GitHub - riveryue/sundial,这个分支updateCronActivrImmediately。使用时需要在任务类

2022-01-24 23:46:07 3687 1

原创 用两个栈stack来实现队列queue Java实现

import java.util.Stack;/** * 用栈来实现队列 */public class StackQueue<T> { //stack1用来存放元素 private Stack<T> stack1 = new Stack<>(); private Stack<T> stack2 = new Stack<>(); public void push(T t) { stack.

2020-05-31 09:53:47 556 1

原创 为什么HashMap的容量必须为大于该容量的最小的2的n次幂

调用HashMap的put方法将一个键值对存到map中,会先计算key的散列值。该散列值是int基本类型,int的范围为~,用这个散列值来确定map的数组下标(jdk8之前HashMap的数据结构是数组+链表,jdk8之后又加上了红黑树)。但这散列值太大,map的容量不可能这么大,会内存溢出。所以需要通过一种方式将这个key的散列值与map的容量对应起来。比如说将散列值与map容量取模,这样得到的结果一定小于容量了,就可以拿来做数组下标了,但取模计算的速度较慢。jdk采用了这种方式计算下标:(n -

2020-05-18 00:21:43 897

原创 用Java手写链表

public class LinkedList<E> { private int size; private Node dummyHead; private class Node { private E e; private Node next; private Node(E e, Node next) {...

2020-03-23 17:16:29 263

原创 Java8中Collectors工具类的常用方法总结

import com.google.common.collect.Lists;import lombok.Data;import lombok.extern.slf4j.Slf4j;import org.junit.Before;import org.junit.Test;import java.math.BigDecimal;import java.util.Arrays;im...

2019-09-30 15:00:44 1261

原创 Java集合去重

集合去重,可以使用Set不能添加重复元素的特性来实现,像下面这样public class Test { public static void main(String[] args) { List<Car> cars = Arrays.asList(new Car("benz"), new Car("bmw"), new Car("bmw")); ...

2019-09-23 16:04:50 1739

原创 elasticsearch-head插件连接不上elasticsearch的处理方式

在elasticsearch的安装目录下找到config文件夹,找到elasticsearch.yml文件,打开编辑它,加上如下这两行配置http.cors.enabled: truehttp.cors.allow-origin: "*"http.cors.enabled配置项表示是否支持跨域,默认为false;http.cors.allow-origin,当设置允许跨域,默认为*...

2019-08-16 10:46:34 10481 1

原创 Java的时间类库joda教程

使用原生Java操作时间是比较麻烦的,比如说简单的创建一个指定时间String time = "2018-7-3 11:00:00";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = null;try { date = sdf.parse(time);} catch (...

2019-06-29 09:38:52 3910

原创 自旋锁

自旋锁是一种乐观锁,和悲观锁不同,比如synchronized,乐观锁不会先尝试获取锁,而是直接做操作,通过一定判断条件来决定是否执行操作。悲观锁的一大缺点是不管存不存在竞态条件,都会加锁,要是并发量高,锁的时间又长,那将性能堪忧。而乐观锁从本质上来说,已经不存在锁的概念了。每个线程在操作前会先校验与其他线程存在共享的数据,如果存在这样的数据,那将会一直校验,直到没有共享的数据,然后再执行...

2019-03-25 00:01:05 316

原创 Java返回给前端的数值太大,导致前端显示时精度损失的问题解决方式

Java的Long类型的范围比JavaScript大,那就有可能导致精度损失的情况。先来看看JavaScript的Number的最大值再看看Java的Long类型的最大值   解决方法很简单,如果Java返回给前端的是个对象,就是在对象里可能出现大数值的那个属性上加个注解,比如说这样:import com.fasterxml.jackson.databind.an...

2019-01-23 20:12:40 5752

原创 linux下elasticsearch的安装

可以在本地下载好elasticsearch,再用filezilla等工具上传到服务器,但有点麻烦。直接用wget命令就比较方便:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.0.tar.gz这样就能下载elasticsearch的压缩包,注意这里的版本是6.5.0。之后安装kiban...

2018-12-16 20:28:42 131

原创 使用nginx设置代理调试本地接口

调试接口可以用postman、fiddler、RESTClient等工具,也可以不依赖这些软件,直接把本地设置成代理服务器,这样在页面发送的请求就会被本地接收到,本地进行处理后,再将结果返回给服务器。相较使用工具,这样测试接口会方便得多。nginx的下载地址http://nginx.org/en/download.html,下载后先解压,进入conf文件夹,打开nginx的配置文件nginx....

2018-12-09 12:07:58 6827 1

原创 用wait、notifyAll实现生产者消费者模式

学习多线程,生产者消费者模式是一个绕不开的话题。所谓生产者消费者模式就是两组线程共享同一内存区域,生产者不停地从中放置数据,而消费者不停地从中取走数据。上面说到的内存区域应该是一个阻塞队列,如果不是,那就会出现线程安全问题了。阻塞队列可由BlockingQueue实现,也可用wait、notifyAll实现,这两个方法继承自Object类。下面的示例代码中,Product类表示生产者,Cons...

2018-11-04 22:29:04 300

原创 Java并发包CountDownLatch的用法

Java的CountDownLatch是Java1.5新出现的类,用作在多个线程都执行完成之后再执行特定方法。latch译作门闩,CountDownLatch可以理解为程序里若干门闩,或是计数器,至于到底有几个门闩,可以在CountDownLatch的构造方法中指定,当门闩都被打开后,程序才会继续执行。调用CountDownLatch的countDown方法就表示打开了一个门闩,门闩都被打开后,C...

2018-10-14 17:12:56 347

原创 使用Java反射机制动态创建和访问数组

java.lang.reflect包提供了一个Array类,使用Array类可以动态地创建和访问数组。static newInstance(Class&lt;?&gt; componentType, int length)方法可创建数组。componentType用以指定数组的元素类型,length用以指定数组长度。该方法返回一个Object,可考虑使用强制转换。static native...

2018-09-08 22:26:51 1173

原创 Java序列化与反序列化

当需要把一个对象保存在文件、数据库中,或是将其在网络上传播的时候,就需要对其进行序列化。序列化和反序列化就是分别把对象转成字节序列和把字节序列恢复成对象的过程。实现Serializable接口是应用序列化与反序列化的一种方式。这个接口没有方法,这种叫标记接口,表示实现这个接口的类可以被序列化。若类中的某个属性不想被序列化时,可以加上transient关键字修饰,这样在序列化时,这个属性就会按其类型...

2018-06-08 10:23:57 136

原创 线程池的使用

本文说明的线程池是定长线程池,定长线程池创建指定个数的线程。当有任务要执行时,线程调度器会找一个空闲线程来执行任务,若没用空闲线程,就会等线程忙完了后再执行任务。举个例子,找出1到200000里质数的集合,最简单的方法是一个for循环。但用一个线程处理这么多数,效率很低。可以考虑使用多线程的方式,那就到了线程池发挥作用的时候了。把1到200000分成四个区间,启动四个线程处理这四个区间。下面的实例...

2018-05-18 21:51:08 160

原创 Fork/Join框架

ForkJoin框架是Java7的新特性,用于并行处理大型任务的。其核心思想是将一个大任务拆分成若干小任务,小任务继续拆分,直到不能再拆。开发人员可自行设置阈值用以控制任务拆到什么程度后不能再拆。拆分完毕后,将创建若干线程,每个线程都有一个任务队列,之前拆分的任务会被放到这些队列中。此处的队列的是双端队列。为提高资源利用率,先处理完任务的线程不会闲着,它随机找一个线程的任务队列偷任务来处理,从队尾偷,而任务被偷的那个线程执行任务时是从对头拿任务。这称为工作密取(work strealing)机制。Fork/

2018-05-11 17:48:50 203

原创 Java反射机制(四)

这篇讲讲如何利用反射机制调用方法,需要用到Method类(java.lang.reflect),获取Method对象一般有如下四种方法。1.Method getMethod(String name, Class&lt;?&gt;... parameterTypes)返回某对象指定的类的指定的共有方法,name参数表示方法名称,parameterTypes表示方法的参数类型的Class对象,且该参数...

2018-04-29 10:26:42 102

原创 Java反射机制(三)

这期讲讲反射机制如何获取类的属性,类的属性对应Field类(java.lang.reflect.Field),主要有如下四种方法:1.Field getField(String name)该方法返回某Class对象对应的类的名称为name的且以public修饰的属性2.Fiele getDeclaredField(String name)该方法返回某CLass对象对应的类的名称为name的属性,与...

2018-04-28 22:25:53 128

原创 Java反射机制(二)

    上篇博客讲了反射概念,这次就来讲讲反射的应用之使用反射创建对象。使用反射机制创建对象需要用到反射API中的Constructor,获取Constructor类常用的有下述四种方法:1.Constructor&lt;T&gt; getConstructor(Class&lt;?&gt;... parameterTypes)该方法返回此Class对象所表示的类的权限修饰符为public的构造方...

2018-04-25 16:37:49 134

原创 Java反射机制(一)

    Java的反射机制是构建框架技术的基础,功能强大且复杂。使用其可以编写能够动态操纵Java代码的程序。在Java中,反射机制是指在运行状态,对于任意一个类,都可以知道该类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取信息以及动态调用对象方法的功能称为反射机制。注意:Java不是动态语言。动态语言是能在程序运行时允许改变程序结构或变量类型的语言。Java反射可以...

2018-04-24 22:09:07 258

空空如也

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

TA关注的人

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