java
小宇宙121
这个作者很懒,什么都没留下…
展开
-
申请码唯一性
需求:mysql数据库,根据数据库id,生成申请码,保证唯一性方案:取数据库最大的id,根据id+1生成新的申请码。弊端:如果有多个线程同时取到了最大的id,就会生成相同的申请码。优化方案:先往数据库添加一条数据(占位,保证唯一性),生成id,根据id生成申请码,再更新这条数据。...原创 2019-12-24 15:02:26 · 181 阅读 · 0 评论 -
Clone
People p1 = new People();People p2 = p1;System.out.println(p1==p2); //true这种操作只是引用的赋值,实际指向的仍然是同一个对象。new对象时,构造函数链中的所有构造函数都会被自动调用。如果一个对象实现了Cloneable接口,那么就可以调用它的Clone()方法。Clone()方法不会调用任何类构造函数。只是在第一次...原创 2019-09-20 17:38:02 · 374 阅读 · 0 评论 -
springboot定时任务
使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:1. 基于注解(@Scheduled)2. 基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。3. 基于注解设定多线程定时任务原文链接:https://www.cnblogs.com/...转载 2019-09-19 17:20:33 · 351 阅读 · 0 评论 -
AtomicInteger
定义public class AtomicInteger extends Number implements java.io.Serializable { private static final long serialVersionUID = 6214790243416807050L;实现了序列号接口,编码时最好手动生成序列ID,让javac编译器生成开销大,而且可能造成意想不到的...原创 2019-09-18 16:51:32 · 254 阅读 · 0 评论 -
线程安全与共享资源
线程安全与共享资源允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不存在竞态条件。当多个线程同时更新共享资源时会引发竞态条件。因此,了解java线程执行时共享了什么资源很重要。局部变量局部变量存储在线程自己的栈中。永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的。java内存模型中,基础类型的局部变量存放在栈中,对象及数组存放在堆里,线程栈里存放对象的引用,指向堆...转载 2019-09-18 16:39:07 · 186 阅读 · 0 评论 -
ConcurrentLinkedQueue介绍
定义一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部是队列中时间最长的元素。队列的尾部是队列中时间最短的元素。 新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。函数offer(E ...原创 2019-09-17 11:34:16 · 186 阅读 · 0 评论 -
java关键字
static关键字:静态的、全局的,一旦被static修饰说明在一定范围内是共享的,谁都可以访问,这时候就要注意并发读写问题。可以修饰变量、方法、方法块1、修饰变量如果是public的,任何类都可以调用,不用初始化类就可以调用。调用方法:类名.static变量。此时要注意如果多个线程同时操作该数据,可能出现并发问题。例如:public static List list = new Ar...原创 2019-09-17 17:14:23 · 123 阅读 · 0 评论 -
ConcurrentHashMap缓存
如果只是要实现一个简单的缓存,使用redis、memecache又太重,也不需要将数据持久化,可以使用ConcurrentHashMap实现一个简单的缓存,避免多次操作数据库,提升效率。ConcurrentHashMap的get(Object key)不加锁,只有在put、remove操作时才加锁,但是也可能不会有锁争用,因为ConcurrentHashMap将缓存变量分到多个segment,分...原创 2019-09-11 15:27:02 · 1453 阅读 · 0 评论 -
@PostContruct和@PreDestroy
开发时遇到一个需求,在应用关闭时将序列号放入redis,重启应用时取出该序列号,放入缓存,删除redis记录,继续在它的基础上自增生成新的序列号。使用的是@postContruct和@preDestroy标签。@componentpublic class CacheBean { @AutoWired StringRedisTemplate template; @PostConst...原创 2019-09-03 13:25:02 · 313 阅读 · 0 评论