java
文章平均质量分 92
李怀念
这个作者很懒,什么都没留下…
展开
-
java线程随笔
为什么要使用线程池? 1. 降低资源消耗:通过重用已经创建的线程来降低线程创建和销毁的消耗 2. 提高响应速度:任务到达时不需要等待线程创建就可以立即执行 3. 提高线程的可管理性:线程池可以统一管理、分配、调优和监控 线程池可以通过ThreadPoolExecutor来创建,构造函数如下: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueu原创 2021-06-23 14:54:44 · 111 阅读 · 0 评论 -
JVM相关知识记录
Java虚拟机在运行时,会把内存空间分为若干个区域,根据《Java虚拟机规范(Java SE 7 版)》的规定,Java虚拟机所管理的内存区域分为如下部分:方法区、堆内存、虚拟机栈、本地方法栈、程序计数器。 1.方法区 方法区主要用于存储虚拟机加载的类信息、常量、静态变量,以及编译器编译后的代码等数据。在jdk1.7及其之前,方法区是堆的一个“逻辑部分”(一片连续的堆空间),但为了与堆做区分,方法区还有个名字叫“非堆”,也有人用“永久代”(HotSpot对方法区的实现方法)来表示方法区。 从jdk1.7已经转载 2021-02-19 15:32:07 · 107 阅读 · 0 评论 -
HashMap学习笔记
HashMap线程不安全体现在会造成死循环、数据丢失、数据覆盖这些问题。其中死循环和数据丢失是在JDK1.7中出现的问题,在JDK1.8中已经得到解决,然而1.8中仍会有数据覆盖这样的问题。 JDK1.7的Entry<K,V>(JDK1.8改成了 Node): static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; int hash;/原创 2020-07-30 14:20:40 · 168 阅读 · 0 评论 -
分布式锁简单随笔
前言:防止看完忘记,做一点小笔记方便自己通过这些点回忆起来。 为何高并发会导致数据库数据出现问题? 一般程序的更新操作分为两个步骤,先查询再更新,查询和更新之间存在一定的业务,如:增加一条订单信息。高并发情况下,可能会存在1线程还未更新,2线程查库的数据与1相同,之后并行更新导致库存虽然为0,但产生多于原库存数量的订单(也就是超卖了)。单机应用面对高并发使用lock,sysnc就可以保证不会超卖,但分布式系统会有问题。 如何实现分布式锁? 常见的三种方式:数据库分布式锁,zk分布式锁,redis分布式锁。原创 2020-05-25 09:00:29 · 182 阅读 · 0 评论 -
Java前后端时间格式的转换
背景 在web项目中,前端的时间展示一般是一个字符串类型(String),但是后端的时间类型则一般为日期类型(Date),在前端与后端交互的过程中,经常会涉及到String类型时间和Date类型时间的相互转换,现将两者之间的相互转换做一个小结: 前端 Date->String的转换。 前端一般可以使用时间控件完成将Date类型的时间转换为String类型。例如:easyUI 由于本...原创 2019-03-11 10:54:18 · 2304 阅读 · 0 评论 -
Linux环境安装jdk和redis
Linux环境安装redis 1.安装JDK8(已装跳过) 第一步:创建jdk安装目录(该/usr/local/src 目录是空的,最好把我们自己下载的放到这,容易区分) [root@localhost jdk]# mkdir -p /usr/local/src/jdk 第二步:查看安装程序 [root@localhost jdk]# rpm -qa | grep -i jdk ...原创 2019-07-15 10:39:52 · 649 阅读 · 0 评论