- 博客(352)
- 收藏
- 关注
原创 JUC同步队列SynchronousQueue
同步队列SynchronousQueue:没有容量,进去一个元素,必须等待取出来之后,才能再往里面放一个元素!具体方法:put,takeapi中的描述:代码实现:import java.util.concurrent.BlockingQueue;import java.util.concurrent.SynchronousQueue;import java.util.concurrent.TimeUnit;public class SynchronousQueueDemo { pub
2020-12-29 15:18:35 139 2
原创 JUC阻塞队列BlockingQueue
学习完队列后,以后集合的示意图就要变成:什么情况下我们会使用阻塞队列:多线程并发处理,线程池!下面来使用一下阻塞队列BlockingQueue:抛出异常的api:add和removeimport java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;public class BlockingQueueDemo { public static void main(String
2020-12-28 22:02:20 162
原创 JUC之读写锁:ReadWriteLock
为什么会存在读写锁呢?1、因为synchronized粒度太大了,并不适合我们,可重入锁的粒度相较于读锁(共享锁)也较大,我们需要粒度小的锁。2、大部分场景下,读不需要加锁,而写需要加锁,因为写入不加锁有可能出现写入覆盖和信息不一致的情况,并且大部分的读需求粒度更小的锁,这样会占用更少的资源。独占锁(写锁)—次只能被一个线程占有共享锁(读锁)多个线程可以同时占有这里先不加锁import java.util.HashMap;import java.util.Map;public class
2020-12-28 14:34:00 144 2
原创 JUC辅助类Semaphore(信号量)
·api解释限流作用的一个工具类,规定了多少数量,同一时间就只能走多少数量,直到有释放出来。代码如下:import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class SemaphoreDemo { public static void main(String[] args) { //模拟一个抢车位场景 Semaphore semaphore = n
2020-12-28 14:04:06 118
原创 JUC辅助类CyclicBarrier(栅栏)
api解释:类似CountDownLatch,但是是一个加法计数器。从0开始计数具体方法:cyclicBarrier.await();等待到CyclicBarrier内规定数量,才会执行await内的语句。具体代码如下:import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;public class CyclicBarrierDemo { public sta
2020-12-28 13:20:32 237
原创 JUC辅助类CountDownLatch
api里的解释:就是一个计数器,辅助全部线程按顺序执行。 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。 A CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用CyclicBarrier 。使用代码:import java.util.concurren
2020-12-26 21:42:51 91 1
原创 callable和runable的比较
废话不多说,直接看一下api里面对callable的解释: Callable接口类似于Runnable ,因为它们都是为其实例可能由另一个线程执行的类设计的。 然而,A Runnable不返回结果,也不能抛出被检查的异常。 所以比起runable来说,callable有以下特点:1、有返回值2、可以抛出异常3、方法不同,run(),call()要使用callable还不能直接像runable一样,而是要借助futureTask代码如下:import java.util.concurren
2020-12-26 21:23:06 855
原创 MAP安全类:ConcurrentHashMap解析
下面先来说说map类下的 HashMap:HashMap的构造方法,可以写初始化容量和加载因子,默认是16和0.75,这里可以从源码查看: static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 static final int MAXIMUM_CAPACITY = 1 << 30; static final float DEFAULT_LOAD_FACTOR = 0.75f;但,Has
2020-12-26 20:10:49 313
原创 集合安全类CopyOnWriteArraySet源码解析
CopyOnWriteArraySet的构造方法源码上是这样写的,所以直接参考COW即可: public CopyOnWriteArraySet() { al = new CopyOnWriteArrayList<E>();}这是CopyOnWriteArraySet源码
2020-12-26 14:22:25 83
原创 集合安全类CopyOnWriteArrayList源码解析
用不是同步的集合在多线程的情况下会出现ConcurrentModificationException错误,原因是扩容过程中被遍历 而解决这个问题的方法有两种,一个是使用vector,另一个是juc里的COW(copyonwritearraylist) 先来谈谈vector,这个东西其实就是Arraylist的所有声明方法上都加上s
2020-12-26 14:13:32 126
原创 ConcurrentModificationException怎么发生的
看代码,我这里是用的不安全集合 ArrayList,然后我再遍历添加元素,在遍历中输出集合。package collection;import java.util.ArrayList;import java.util.UUID;public class SafeCollection { public static void main(String[] args) { ArrayList<Object> list = new ArrayList<>(
2020-12-26 13:49:19 88
原创 8锁问题,探究锁到底锁了谁,谁被锁了
8锁就是8个锁的问题,直接探究出到底锁的是谁:下面看题和结果就可以了。题的情况很简单,就是一个Phone类,里面有打电话和发短信俩方法,答案就是先发短信还是先打电话即可:问题1:正常情况下,谁会先输出出来package lock8;import java.util.concurrent.TimeUnit;//1、正常情况下,谁会先输出出来public class Test1 { public static void main(String[] args) { Phone
2020-12-25 20:20:34 367
原创 使用同步监视器condition进行顺序输出
这里需要明白的是,同一把锁可以new出很多个同步监视器,我们这里的顺序执行是通过多个的同步监视器做到的,A执行=》唤醒B=》B执行=》唤醒C=>C执行=>唤醒A=》执行Aimport java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class C { public
2020-12-25 16:02:06 109 1
原创 JUC生产者消费者问题
juc版本和synchronized版本的区别:juc这里使用锁需要事先在类里面声明锁,然后用锁获取newCondition,使用condition类即可,以下是jdk,api里面写的例如,假设我们有一个有限的缓冲区,它支持put和take方法。 如果在一个空的缓冲区尝试一个take ,则线程将阻塞直到一个项目可用; 如果put试图在一个完整的缓冲区,那么线程将阻塞,直到空间变得可用。 我们希望在单独的等待集中等待put线程和take线程,以便我们可以在缓冲区中的项目或空间可用的时候使用仅通知单个线程
2020-12-25 15:30:51 125
原创 synchronized 的虚假唤醒问题
虚假唤醒:线程也可以唤醒,而不会被通知,中断或超时,即所谓的虚假唤醒 。 虽然这在实践中很少会发生,但应用程序必须通过测试应该使线程被唤醒的条件来防范,并且如果条件不满足则继续等待。(当线程只有一个消费者和一个生产者的时候不会发生,多个生产者和多个消费者同时进行if判断时才会发生)举个简单例子,我们正常的生产者和消费者问题应该是://线程之间的通信问题:生产者和消费者问题!等待唤醒,通知唤醒线程交替执行A B操作同一个变量num = 0// A num+1// B
2020-12-25 14:44:59 302
原创 公平锁和非公平锁的区别以及什么是CAS
什么是CAS?CAS是compare and swap的缩写,即我们所说的比较交换。cas是一种基于锁的操作,而且是乐观锁。什么是公平锁?通过源码观察,我们发现,公平锁会先去获取当前锁的状态,如果当前锁没有被占用,则获取当前的前驱节点(!hasQueuedPredecessors,看有没有存在阻塞队列),再去进行一次CAS修改同步状态变量,成功返回true。否则加入阻塞队列,即排队等待。 static final class FairSync extends Sync { priv
2020-12-25 10:52:06 1162
原创 juc之锁2:Lock锁的可重入锁ReentrantLock
Lock所在的包是在JUC下的lock包下:实现类有可重入锁,读写锁在jdk文档下查看一下使用方法:以下是我使用的例子:import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Test2 { public static void main(String[] args) { Ticket ticket =new Ticket
2020-12-23 21:37:38 108
原创 juc之锁1:使用传统的Synchronized
没有使用Synchronized前:import java.sql.Time;import java.util.concurrent.TimeUnit;public class Test1 { public static void main(String[] args) { Ticket ticket =new Ticket(); new Thread(()->{ for (int i=1;i<60;i++) ti
2020-12-23 21:10:03 97 1
原创 操作系统和java的线程状态
今天在看juc,发现java的源码线程状态和操作系统的不同,java的Thread.State源码中, 是有六种状态的,下面来说说操作系统和java的线程的不同。操作系统中线程的状态有:初始状态(NEW)可运行状态(READY)运行状态(RUNNING)等待状态(WAITING)终止状态 (TERMINATED)java的线程状态有:这里是从java的Thread.State源码里面翻的public enum State { //新生 NEW, //运行 RU
2020-12-23 19:24:42 337
原创 设置主键自增从任意数字开始,不删除数据的情况下
我做一个vue+spring cloud的前后端分离项目里,出现了很尴尬的事情,就是我的后端Mybatis-plus用的是默认的雪花算法,然后前端取不到精确数据,导致我做修改或者是删除功能的无法到具体的数据删除。然后把mp的主键自增策略改成auto,发现数据库居然自增的是雪花算法的id。。。这下尴尬了,百般尝试下总算可以在不删除数据的情况下,设置主键自增从哪里开始ALTER TABLE USER AUTO_INCREMENT 8; 里面的USER是表名8是你要设置成的自增数字...
2020-12-19 17:24:35 320 1
原创 vue使用element ui的tree树形控件模板
需要什么属性就去官方文档查询,然后在对应位置填上,我这个模板经供参考控件属性<!-- --><template> <el-tree :data="menu" :props="defaultProps" :expand-on-click-node="false" show-checkbox node-key="catId"> <span class="custom-tree-node" slot-scope="{ node, data }"&
2020-12-18 13:41:24 658
原创 跨域问题:CORS plicy: Response to preflight request doesn‘t pass access control No ‘Access-Control-AllC
出现这个错误说明你的网页访问存在跨域问题,可以看我这个文章跨域问题解决
2020-12-17 20:32:15 225
原创 跨域问题:has been blocked by CORS policy: The ‘Access-Control-Allow-Origin‘ header contains
has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header contains multiple values ‘http://localhost:8001, http://localhost:8001’, but only one is allowed.这是说明你的跨域请求有多个但是只允许一个,这时候你检查一下自己的网关和项目的跨域配置即可...
2020-12-17 20:24:45 11482
原创 使用gateway网关解决浏览器跨域问题,源码解析
跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。我们这里利用CORS策略,对我们的网关进行修改,让他接收到跨域请求的时候忽略掉OPTION中的报头不同。这里我们创建个config包,来装跨域配置spirngbot配置中在CorsWebFilter设置了跨域问题,我们只需要写一个方法覆盖他即可,翻看源码我们可以发现他需要两个类,一个是CorsConfigurationSource还有一个是CorsProcessor,而CorsConf
2020-12-17 20:15:10 757 1
原创 jdk8的Stream流快速使用
不多bb就告诉大家这个东西干嘛用的,然后就开始用:Stream API对集合数据进行操作,就类似于使用SQL执行的数据年近询。也可以使用Stream API来并行执行操作。简言之,Stream API提供了一种高效且易于使用的处理数据的方式。这是过程:以下是常用方法(图是扣的,侵删:import java.util.Arrays;import java.util.Comparator;import java.util.List;import java.util.stream.Collecto
2020-12-16 14:28:47 245
原创 使用element UI模板快速创造一个可视化界面
首先导入elementUI里面的组件模板:1、在src下的App.vue下使用模板<template><el-container style="height: 500px; border: 1px solid #eee"> <el-aside width="200px" style="background-color: rgb(238, 241, 246)"> <el-menu :default-openeds="['1', '3']">
2020-12-15 14:37:39 2480
原创 VSCode 代码整理快捷键
VSCode 代码格式化 快捷键Visual Studio Code可以通过以下快捷键 格式化代码:On Windows Shift + Alt + FOn Mac Shift + Option + FOn Ubuntu Ctrl + Shift + I
2020-12-15 14:03:46 2030
转载 踩坑:The template root requires exactly one element.
这是因为vue的模版中只有能一个根节点,所以在中插入第二个元素就会报错解决方案:将中的元素用一个大的包起来,这样就可以在其中添加多个元素了,可以参考以下示例:<template> <div id="vue"> Hello Vue.js!{{message}} <span>{{message1}}</span> <span v-if="seen">你看到我啦!</span> <div i
2020-12-15 13:15:17 254
原创 npm出现ENOTFOUND解决办法
npm有时候总出现这个,很烦躁,这时候推荐直接npm config set registry http://registry.cnpmjs.org/下载成功了,但是用的不是淘宝镜像了
2020-12-15 12:53:48 7319
原创 详解v-for各个参数
开始很懵逼为什么v-for会有三个元素,明明两个就够用了,然后我尝试了一下,用数组存对象然后使用三个元素,index总取不出来。代码如下: <div id="app"> <ul> <li v-for="(v,k,index) in users"> {{v}}====={{k}}====={{index}} </li> </ul>
2020-12-14 14:25:33 7708 1
原创 springboot2.4降级到boot2.2.x
最近在做一个springcloud的整合项目,但是springcloud-alibaba的nacos只支持2.2.x版本,而项目开始也没注意,直接用的2.4版本,所以这里记录下降级踩下的坑。这里直接把boot版本号改成2.2.6然后去启动主启动类会出现 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter
2020-12-10 13:53:00 3410 4
原创 docker容器内可以联网ping,但是无法curl的问题解决
docker容器内可以ping,但无法联网curl问题解决firewall-cmd --zone=public --add-masquerade --permanentfirewall-cmd --reloadsystemctl restart docker困扰了我一个月,今天终于解决了
2020-11-28 18:15:19 2309 1
原创 @Component注解工具类的一个坑
使用@Component注释工具类的话,请不要再去new对象,而是使用@Autowired去获取对象,不然很容易出各种错误
2020-11-26 18:12:37 2529
原创 安装最新版redis遇到的坑
提示了一堆的这个错误信息,实际上就是c++的版本太低了,只要更新c++即可server.c:5151:94: error: ‘struct redisServer’ has no member named ‘unixsocket’ serverLog(LL_NOTICE,"The server is now ready to accept connections at %s", server.unixsocket);
2020-11-21 15:00:19 1974
原创 Mybatis-plus主键生成策略无法生成主键
记录一次事故,事情说这样的,我的mybatis-plus一切主键都能正常操作,唯独到了自动填充这里出现了问题,我的主键并不能生成雪花算法,而一直都是0,我刚开始以为是版本问题紧接着,我就自己写主键生成策略,希望知道到底出现什么问题:还是出错,正当我难受的时候,我重写了一次pojo类,发现了问题我的Long原本居然是long,真尴尬,关键其他功能一点没问题,也没报错过。。。...
2020-11-17 18:10:37 1772 2
原创 vue获取表单参数并且展示在前端和404
1.首先去js里把提交连接上附上我们要的值 this.$router.push("/main/"+this.form.username);以下是Login.vue全部代码<template> <div> <el-form ref="loginForm" :model="form" :rules="rules" label-width="80px" class="login-box"> <h3 class="login-title"&
2020-11-04 18:14:33 509
原创 vue路由传递参数和重定向
传递参数分为三步:1、先去要使用的路由下路径给上要传的参数,特别注意路由还需要给上名字 path:'/user/profile/:id', component:UserProfile, name:'UserProfile'2、修改连接方式,在to前面绑定上v-bind: <el-menu-item index="1-1"> <router-link :to="{name:'UserProfile',param
2020-11-04 15:00:32 847 1
原创 vue嵌套路由的使用
嵌套路由的使用主要分为以下几个部分:1、像以前一样编写一个要被嵌套的组件<template> <div>内容列表</div></template><script> export default { name: "Content" }</script><style scoped></style>2、在路由配置里的主路由里面使用 children:
2020-11-04 14:26:04 417
原创 vue路由的学习及使用
在vue的支持下前端现在不需要用a标签做跳转了,可以使用路由进行跳转,接下来来说说路由怎么用。我喜欢按部就班,我们就按步骤来:1.要使用路由 先去你idea里的对应vue项目,安装一下路由npm install vue-router --save-dev2.写你需要的组件<template><div>这有一段内容</div></template><script> export default { name
2020-11-01 20:23:38 153
原创 vue-cli的安装
1、什么是vue-clivue-cli官方提供的一个脚手架,用于快速生成一个vue的项目模板预先定义好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个骨架项目,这个估计项目就是脚手架,我们的开发更加的快速;主要的功能统一的目录结构本地调试热部署单元测试集成打包上线2、需要的环境安装nodejs:Node.js:http://nodejs.cn/download/安装就是无脑的下一步就好,安装在自己的环境目录下Git:https://git-sc
2020-11-01 12:05:07 167
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人