
Java
文章平均质量分 66
java
I WANT TOO
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
如何显示IntelliJ IDEA工具的Run Dashboard功能
从 JetBrains released IntelliJ IDEA 2017.2.1 版本之后,新出的功能Run Dashboard,它能非常方便的提供开发人员查看本地springboot服务运行的一些参数,功能相当优秀。 但IDEA默认不显示此功能,可以通过下面的方式来打开它 点击IDEA上面工具栏View—Tool Windows—Run Dashboard 即可打开界面 如果Tool Windows的子选项里没有Run Dashboard,可以在工程目录下找.idea文件夹下的workspace原创 2021-04-30 15:04:47 · 216 阅读 · 1 评论 -
基于SpringBoot的跨域解决方案-CORS
什么是CORS CORS是一个W3C标准,全称是"跨域资源共享”(Cross-origin resource sharing)。它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。CORS需要浏览器和服务器同时支持。它的通信过程,都是浏览器自动完成,不需要用户参与。 浏览器做了什么 浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。 浏览器发出CORS原创 2021-01-07 10:23:42 · 237 阅读 · 1 评论 -
Tomcat 启动日志乱码
场景再现 修改后 打开logging.properties vi tomcat/conf/logging.properties 修改 java.util.logging.ConsoleHandler.encoding = utf-8 >>> java.util.logging.ConsoleHandler.encoding = GBK原创 2020-09-14 10:58:09 · 246 阅读 · 0 评论 -
JUC并发容器类
ArrayList ArrayList是一个可变长度的数组,构造时可以指定一个数组初始长度,不指定则默认为0 扩容机制 扩容过程 创建一个新的数组,长度为newCapacity 把旧的数组数据elementData拷贝到新数组 elementData = Arrays.copyOf(elementData, newCapacity); 扩容算法 ArrayList第一次执行添加操作...原创 2020-03-20 17:17:20 · 180 阅读 · 0 评论 -
ReadWriteLock使用及抢锁原理
概述 概念 维护一对关联锁,一个只能用来读操作,一个只能用来写操作; 读锁可以由多个读线程共同持有(共享锁),写锁是排他的(独享锁)。 同一时间,两把锁不能被不同线程持有 使用场景 适合读取操作多于写入操作的场景,改进互斥锁的性能,比如:集合的并发线程安全性改造、缓存组件。 为什么读的时候还需要加锁? 当写的操作为需要保证原子性的多步操作时,此时如果只是在写上加锁而未在读上加锁,...原创 2020-03-20 17:11:58 · 439 阅读 · 0 评论 -
Lock接口原理及使用总结
Lock接口 void lock() 如果锁被占用则会一直等待,直到其他线程释放锁,当前线程获取到锁为止 示例代码: package com.hzw.subject1.lock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockDe...原创 2020-03-20 17:08:43 · 568 阅读 · 0 评论 -
Synchronized从使用到原理
概述 使用:用于修饰实例方法、静态方法时,隐式指定锁对象;用于代码块时,显示指定锁对象 作用域:对象锁、类锁、分布式锁 特性:可重入、独享、悲观锁 锁优化:锁消除 如何记录加锁状态 默认情况下JVM锁会经历:未锁定 -> 偏向锁 -> 轻量级锁 -> 重量级锁 这四个状态 对象在堆里面是如何存储的? 什么是Mark Word 加锁过程 偏向锁 在JDK6以后,默认已将开启...原创 2020-03-20 17:05:38 · 132 阅读 · 0 评论 -
Java中锁的概念
Java中锁的概念 **自旋锁:**是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待 ,然后不断的判断锁是否能够被成功获取,知道获取到锁才会退出循环。 **乐观锁:**假定所有操作都没有冲突,在修改数据时如果发现数据和之前获取的不一致,则先读取最新数据然后重试修改 **悲观锁:**假定所有操作都会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁。 ...原创 2020-03-20 16:59:01 · 172 阅读 · 0 评论 -
Atomic原子操作类
Atomic* Atomicboolean:原子更新布尔类型 AtomicInteget :原子更新整形 AtomicLong:原子更新长整型 AtomicReference:原子更新引用类型 AtomicStampedReference:原子更新带有版本号的引用类型(可解决ABA问题) AtomicMarkableReference:原子更新带有标记位的引用类型(可解决ABA问题) 下面以Ato...原创 2020-03-20 16:56:29 · 180 阅读 · 0 评论 -
CAS的三个问题
CAS的三个问题 循环+CAS,自旋的实现让所有线程都处于高频运行,争抢CPU执行时间的状态。如果操作长时间不成功,会带来很大的CPU资源消耗 针对单个变量的操作,不能用于多个变量来实现原子操作 ABA问题 ABA问题 由于CAS操作进行比较替换时只比较了旧值是否相等,比较不够充分导致操作依旧是不够安全的 thread1、thread2同时读取到i=0 thread1、thread2都要执行...原创 2020-03-20 16:54:05 · 203 阅读 · 0 评论 -
线程安全之原子操作
什么是原子操作 原子操作可以是一个步骤,也可以是多个步骤,但是其顺序不可以被打乱,也不可以被切割只执行其中的一部分(不可中断性)。 将整个操作视作一个整体,资源在该次操作中保持一致,这是原子性的核心特征 下面我们看一段代码: package com.hzw; public class Counter { volatile int i = 0; public void add()...原创 2020-03-06 09:01:45 · 250 阅读 · 0 评论 -
优雅的线程中止
不正确的线程中止-Stop Stop:中止线程,并清除监控器锁的信息,但是可能导致线程安全问题,JDK不建议使用 线程安全问题:当子线程未执行完时在主线程使用stop终止了子线程会导致线程安全问题 代码示例: package com.hzw; public class Demo2 { public static void main(String[] args) throws Interr...原创 2020-03-05 10:51:05 · 113 阅读 · 0 评论 -
便携的文件操作-Files
便携的文件操作-Files 分隔符 在Windows系统中使用反斜杠 ‘’ 或者斜杠 '/'来当作路径的分隔符,但是使用反斜杠需要注意: 单个反斜杠代表转义字符,所以在使用反斜杠充当路径的分隔符时需要成对出现 File file1 = new File("E:\\aaa\\1.java"); File file2 = new File("E:/aaa/1.java"); 在Linux,U...原创 2020-03-04 15:26:56 · 372 阅读 · 0 评论 -
Java内存模型
定义 Java内存模型不是JVM运行时数据区,Java内存模型是由Java语言规范提出,用来描述Java多线程程序在执行时的一些规则,JVM运行时数据区是由Java虚拟机规范提出,用来描述JVM虚拟机的特性。 解决什么问题 所见非所得 无法肉眼去检测程序的准确性 不同的运行平台有不同的表现 错误很难重新 package com.hzw.subject1; public class DemoV...原创 2020-03-03 17:47:49 · 105 阅读 · 0 评论 -
线程池应用
作用 为了方便控制线程的数量 线程池的原理 线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务 工作线程:线程池中线程,在没有任务的时候处于等待状态,可以循环的执行任务 任务接口:每个任务必须实现的借口,以提供工作仙尘调度任务的执行,它主要规定了任务的入口,任务执行完成后的首位工作,任务的执行状态等 任务队列:用于存放没有处理的任务,提供一种缓存机制 线程池API E...原创 2020-03-04 07:11:12 · 103 阅读 · 0 评论