自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 高频的反射操作,可以使用「Lambda 生成函数映射」代替

用「 Lambda 生成函数映射」代替「高频的反射操作」

2023-02-21 15:16:52 727

原创 创建线程的4种方法

创建线程的方式

2023-02-20 18:22:46 324

原创 共享锁CountDownLatch练习

共享锁CountDownLatch

2023-02-14 16:36:50 285

原创 SimpleDateFormat是线程不安全的

SimpleDateFormat是线程不安全的

2023-02-08 17:06:31 213

原创 需要在synchronized同步块的内部使用wait()和notify()方法

wait()和notify()类型方法必须放在synchronized()同步块中使用

2023-02-07 16:49:04 311

原创 java8的Comparator排序

Comparator.comparing

2023-02-01 14:55:25 645

原创 ListenableFuture练习

ListenableFuture是对原有Future的增强,用于监听Future任务的执行情况。

2022-10-21 15:41:41 226

原创 java8:使用stream().distinct()对list去重

distinct()是基于hashCode()和equals()工作的。

2022-09-22 16:50:22 2304

原创 [xxl-job]执行器路由策略

13、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;xxl-job官网

2022-03-28 14:54:49 1649

原创 数据库时区查询

mysqlshow variables like'%time_zone';sql serverSELECT CURRENT_TIMEZONE();

2021-12-06 19:17:29 727

原创 python笔记:列表list

列表的长度可变,内容也可以修改。使用中括号[]或者list类型函数来定义列表:a_list = [1, 2, 3, 4]b_list = list(range(10))

2021-11-30 18:38:42 962

原创 Java:什么时候使用Parallel Stream?

原文:When to Use a Parallel Stream in JavaStreams in Java顺序流 Sequential Stream默认,Java中的任何流操作都是顺序执行的,除非特别指定为并行。顺序流是单线程执行的:List<Integer> listOfNumbers = Arrays.asList(1,2,3,4);listOfNumbers.stream().forEach(number -> System.out.println(number +

2021-11-29 16:34:29 2249

原创 openpyxl介绍 :一个用于读写Excel 2010 xlsx/xlsm 文件的python 库

作者:Eric Gazoni, Charlie Clark源代码:https://foss.heptapod.net/openpyxl/openpyxl版本信息:https://openpyxl.readthedocs.io/en/stable/changes.html安装 pip install openpyxl文件中如果包含图片(jpeg, png, bmp,…),需要安装“pillow”库pip install pillowhttps://pypi.org/project/Pillo

2021-10-25 15:36:20 593

翻译 Java 11:Lambda参数的局部变量语法(Local Variable Syntax for Lambda Parameters)

原文:Java 11 Local Variable Syntax for Lambda Parameters1. 介绍Lambda参数的局部变量语法是Java 11引入的唯一个语言特性。本文我们将一起探索这个新特性。2. Lambda参数的局部变量语法Java 10引入的一个关键特性之一为局部变量类型推断:Java 10 LocalVariable Type-Inference,允许用var作为局部变量的类型。编译器根据分配给变量的值推断类型。然后,我们并不能在lambda表达式上应用这个特性。比

2021-08-06 16:06:10 1373

翻译 Java8 Stream API基础教程

原文:The Java 8 Stream API Tutorial1.概述本教程,我们将介绍Java 8 Stream从创建到并行执行的实践。读者要求:Java 8基础知识(lambda表达式,Optional,方法引用)和Stream API基础知识。可以参考之前的文章:New Features in Java 8、Introduction to Java 8 Streams2.Stream创建从不同资源创建一个stream实例有很多方式,一旦创建这个实例,它的资源不会更改,因此从一个单一资源可

2021-08-05 18:46:55 216

翻译 java11新特性

原文:New Features in Java 111.概述Oracle在2018年9月发布了java 11,仅在其前身版本10后6个月。java 11是继java 8 之后第一个长期支持的版本。Oracle在2019年一月份已经停止了对java 8 的支持。因此,大部分人会升级到java 11。在本教程中,我们将看看选择java 11的原因。然后我们将会探索几个新特性,已移除的特性以及java11中引入的性能增强。2.Oracle vs. Open JDKJava10是最后一个免费的Oracl

2021-08-03 09:57:46 10938

原创 java:Collections.EMPTY_LIST

List<Integer> list = Collections.EMPTY_LIST;用Collections.EMPTY_LIST声明的list不能进行add操作否则会报错: java.lang.UnsupportedOperationExceptionCollections.EMPTY_LIST 的实现public static final List EMPTY_LIST = new EmptyList<>();EmptyList是Collections的一个静态内

2021-04-22 17:19:54 424

原创 python日课:基础练习题十三

13、列表list = [1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]知识点1:map()菜鸟教程:Python map() 函数知识点2:列表推导式列表推导式式最受欢迎的Python语言特性之一。它允许过滤一个容器的元素,用一种简明的表达式转换传递给过滤器的元素,从而生成一个新的列表。列表推导式的基本形式:[expr for val in collection if condition]等价于:.

2020-09-01 14:58:10 522

原创 python日课:python笔试题练习(1-10)

1、一行代码实现1-100之和用到两个方法sum() 、 range()range用法:python官方文档2、如何在一个函数内部修改全局变量利用global修改全局变量3、列出5个python标准库python标准库如:datetime — 基本的日期和时间类型math — 数学函数os — 多种操作系统接口sys — 系统相关的参数和函数re — 正则表达式操作4、字典如何删除键及合并两个字典pop(key[, default])如果 key 存在于字典中则将其

2020-08-25 19:22:40 276

原创 python日课:NumPy ndarray

《利用Python进行数据分析》(原书第2版)4.1示例代码练习创建数组In [125]: np.arange(10)Out[125]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])ndarray的数据类型astype方法:显式地转换数组的数据类型如果把浮点数转换成整数,小数点后的部分将被消除。使用astype时总是生成一个新的数组,即使你传入的dtype与之前一样。数组算术同尺寸数组之间的比较,会产生一个布尔值数组。...

2020-08-24 19:11:30 259

原创 流畅的python-第二章:序列构成的数组

《流畅的python》内置序列类型概览列表推导和生成器表达式最重要最基础的序列类型应该就是列表(list)了。list事一个可变序列,并且能同时存放不同类型的元素。列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。列表推导列表推导通常的原则:只用列表推导来创建新的列表,并且尽量保持简短。如果列表推导的代码超过了两行,可能要考虑是不是得用for循环重写了。colors = ['black', 'white']sizes = ['S', 'M', '.

2020-08-20 11:40:25 190

原创 python日课1-1:一摞有序的纸牌

《流畅的python》 第一章 示例1-1特殊方法python解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以以两个下划线开头,以两个下划线结尾的方法:__init__,__len__,__getitem__。这些特殊方法名能让自己的对象实现和支持以下的语言架构,并与之交互:迭代集合类属性访问运算符重载函数和方法的调用对象的创建和销毁字符串表示形式和格式化管理上下文(即with块)示例1-1import collectionsfrom .

2020-08-19 14:32:27 257

原创 happens-before

理解happens-before是理解JMM的关键。JMM的设计在设计JMM时,需要考虑两个关键因素:程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程,希望基于一个强内存模型来编写代码。编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越少越好,这样它们就可以尽可能多的优化来提高性能。编译器和处理器希望实现一个弱内存模型。JMM向程序员提供的happens-before规则不但简单易懂,也向程序员提供了足够强的内存可见性保证。JMM对编译器和处理器的束缚已

2020-08-06 17:05:43 169

原创 锁的内存语义

锁可以让临界区互斥执行。锁的释放和获取的内存语义当线程释放锁时,JMM(Java内存模型)把该线程对应的本地内存中的共享变量刷新到主内存中。当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取共享变量。对比锁释放-获取的内存语义与volatile写-读的内存语义可以看出:锁释放与volatile写有相同的内存语义;锁获取与volatile读有相同的内存语义。线程A释放一个锁,实质上是线程A向接下来将要获取这个锁的某个线程发出了(线程A对共

2020-08-04 14:26:13 232

原创 synchronized和ReentrantLock

共同点都是用来协调多线程对共享对象、变量的访问都是可重入锁,同一线程可以多次获得同一个锁都保证了可见性和互斥性不同点ReentrantLock显示的获得、释放锁,synchronized隐式获得释放锁ReentrantLock可响应中断,可轮回ReentrantLock是API级别的,synchronized是JVM级别的ReentrantLock可以实现公平锁,可以通过Condition绑定多个条件底层实现不一样,synchronized是同步阻塞,使用的是悲观并发策略,lock是

2020-08-03 16:53:01 119

原创 java-volatile关键字

volatile的特性可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入原子性。对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。volatile写的内存语义当写一个volatile变量时,JMM(Java内存模型)会把该线程对应的本地内存中的共享变量值刷新到主内存。如图,线程A在写flag变量后,本地内存A中被线程A更新过的两个共享变量的值被刷新到主内存中。此时,本地内存A和主内存中的共享

2020-08-03 14:35:16 154

原创 Java为什么能够跨平台运行

1、Java代码不是直接运行在CPU上,而是运行在Java虚拟机上的(JVM)。2、java是先把java文件编译成二进制字节码的class文件,jvm就解释执行class文件。3、就是因为java是运行在jvm上的,所以它的代码就能不经修改在不同平台的jvm上运行。...

2020-07-31 19:01:41 1494

原创 经典垃圾收集器

Serial收集器单线程工作只会使用一个处理器或一条收集线程去完成垃圾收集工作进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结算 “Stop The World”与其他收集器的单线程相比,Serial收集器简单而高效;对于内存资源受限的环境,它是所有收集器里额外内存消耗最小的;对于单核处理器或者处理器核心数较少的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。ParNew收集器Serial收集器的多线程并行版本除了Seria.

2020-07-31 18:43:23 177

原创 在并发编程中:线程之间如何通信及线程之间如何同步?

线程之间如何通信通信指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种共享内存消息传递共享内存在共享内存的并发模型里,线程之间共享程序的公共状态,通过 写—读内存中的公共状态进行隐式通信。消息传递在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。线程之间如何同步同步是指程序中用于控制不同线程间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或者某段代码需要在线程之间互斥执行。在消息传

2020-07-30 17:04:50 928

原创 内存分配与回收策略学习理解

Java技术体系的自动内存管理,最根本的目标是自动化解决两个问题:自动给对象分配内存以及自动回收给对象的内存。基本的内存分配原则:对象优先在Eden分配大对象直接进入老年代长期存活的对象将进入老年代空间分配担保对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。大对象直接进入老年代大对象指需要大量连续内存空间的Java对象,最典型的大对象便是那种很长的字符串,或者元素数量很庞大的数组。在JVM中要避免

2020-07-30 15:40:46 234

原创 JVM-运行时数据区

线程私有:程序计数器、虚拟机栈、本地方法栈共享区域:堆、方法区Java堆所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。几乎所有的对象实例和数组都应当在堆上分配。Java堆既可以被设计成固定大小的,也可以是可扩展的。(通过-Xmx、-Xms设定)。方法区各个线程共享的内存区域。运行时常量池是方法区的一部分。Class文件中的一项信息——常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放在方法区的常量池中。运行时常量池.

2020-07-29 17:04:01 115

原创 Java如何实现原子操作

原子操作(atomic operation):不可被中断的一个或一系列操作。Java通过锁和循环CAS的方式来实现原子操作循环CAS自旋CAS实现的基本思路:循环进行CAS操作直到成功为止。CAS实现原子操作的三大问题1)ABA问题参考: Java中的CAS操作2)循环时间长开销大自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。3)只能保证一个共享变量的原子操作。锁机制锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。JVM内部实现了很多锁机制:偏向锁、轻量级锁、互斥锁

2020-07-28 11:25:03 313

原创 动态代理&&静态代理

代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,通俗的来讲代理模式就是我们生活中常见的中介。动态代理和静态代理的区别在于静态代理我们需要手动的去实现目标对象的代理类,而动态代理可以在运行期间动态的生成代理类。静态代理1、为现有的类(Printer类)编写一个对应的代理类,并且让它实现和目标类相同的接口(public class PrinterProxy implements IPrinter )2、在创建代理对象时,通过构造器塞入一个目标对象private

2020-07-23 18:08:48 146

原创 Java中的CAS操作

CAS(Compare and Swap),JDK提供的非阻塞原子性操作,通过硬件保证了比较-更新操作的原子性。JDK里面的Unsafe类提供了一系列compareAndSwap*方法:public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5); public final native boolean compareAndSwapInt(Object var

2020-07-17 16:25:38 666

原创 ReentrantLock公平锁及非公平锁实现

ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞而被放入该锁的AQS阻塞队列里面。根据参数来决定其内部是一个公平锁还是非公平锁。默认非公平锁。 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(

2020-07-15 20:19:10 816

原创 java四种对象引用

强引用软引用弱引用虚引用强引用Strongly Reference指在程序代码之中普遍存在的引用赋值,即:Object obj = new Object()。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。软引用Soft Reference描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出一场前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。/** * Soft refe.

2020-07-13 19:48:48 181

原创 ThreadLocal

ThreadLocal是JDK包提供的,它提供了本地线程变量。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。内存溢出每个线程内部都有一个名为threadLocals的成员变量/* ThreadLocal values pertaining to this thread. This map is maintained * by the Threa

2020-07-13 19:32:32 165

原创 线程池ThreadPoolExecutor的基本配置

ThreadPoolExecutor通用构造函数:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQ.

2020-07-12 22:39:38 341

原创 Redis是如何处理过期的key的?

两种方式被动:惰性删除主动:随机删除当客户端请求一个key时,redis发现该key以过期,则会触发删除操作(惰性删除)。仅仅通过这种被动的方式处理是不够的,毕竟也可能存在大量过期的key永远不会被客户端访问,所以Redis会定期的测试一些随机的存在过期的key,如果过期则会删除(随机删除)。随机测试20个存在过期时间的key删除所有已过期的key如果超过25%的key过期了,则从步骤1开始再来一遍关于数据一致性,当一个key过期了,DEL操作会合到AOF文件中,并获得所有连接的从节

2020-07-09 18:11:15 551

原创 leetcode:数组-桶排序思想理解

数组-1365. 有多少小于当前数字的数字内外循环遍历解法最易懂的方式:1、外循环,遍历数组内每个元素2、内循环,遍历当前元素之前所有元素,累加class Solution { public int[] smallerNumbersThanCurrent(int[] nums) { int[] res = new int[nums.length]; for(int i=0;i<nums.length;i++){ int coun

2020-06-16 17:22:20 268

空空如也

空空如也

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

TA关注的人

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