`
文章列表
JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountDownLatch 与 线程的 join 方法区别是什么? 日常开发中经常会遇到需要在 ...
ReentrantLock实现核心–AQS(AbstractQueuedSynchronizer) AQS,队列同步器,在juc包中的工具类都是依赖于AQS来实现同步控制,看一张AQS的结构图。 同步控制中主要使用到的信息如上图所示。AQS可以被当做是一个同步监视器的实现,并且具有排队功能。当线程尝试获取AQS的锁时,如果AQS已经被别的线程获取锁,那么将会新建一个Node节点,并且加入到AQS的等待队列中,这个队列也由AQS本身自己维护。当锁被释放时,唤醒下一个节点尝试获取锁。  

jdbc原生

package com.jdbctemplate; import java.util.List; import java.util.Map; public interface JdbcTemplateDao { /** * 原生插入 */ public int insert(String sql); /** * 原生插入+参数,采用问号占位符 */ public int insert(String sql, final Object... args); /** * 批量插入,参数为一个LIST包含了多个数组 */ ...

jedis

public interface JRedisService { /** * * @Description (删除键) * @param key * @date 2017年12月26日 */ public void deleteKey(String... key); /** * * @Description (判断key是否存在) * @param key * @return * @date 2017年12月26日 */ public boolean exists(String key); /** ...
   过滤器和拦截器的区别:   ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。  ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。  ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的 ...
  package com.hesc.wpc.common.utils; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java. ...
   ElasticSearch下载地址:https://www.elastic.co/cn/downloads/elasticsearch   1.配置elasticsearch 修改一下es使用的参数。编辑config/elasticsearch.yml:   # 换个集群的名字,免得跟别人的集群混在一起   cluster.name: gqm   # 换个节点名字   node.name: node-001   # 修改一下ES的监听地址,这样别的机器也可以访问   network.host: 0.0.0.0   # 默认的就好   http.p ...
<insert id="insertForeach" parameterType="java.util.List"> insert into mb_member_devinfo (id, member_id, name, phone, org_id, org_name, stage, state, sort, createtime, tenant_code) values <foreach collection=" ...
1.添加一个队列模拟商品列表 启动redis 输入 rpush str 1 2 3 4 5 6 7 8 9 102.利用多线程模拟 20 个人抢购这 10 件商品: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; ...
缓存穿透: 认识   缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。   解决办法:   对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。还有最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。 也可以采用一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存, ...
1.synchronized的几种用法 synchronized关键字最主要有以下5种应用方式,下面分别介绍。 1. 修饰对象普通方法,作用于当前对象,进入同步方法前要获得当前对象的锁 2. 修饰对象静态方法,作用于当前类对象加锁,进入同步该方法前要获得当前类对象的锁 3. 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得指定对象的锁。 4. 修饰 this,指定当前对象,对给当前对象加锁,进入同步代码前要获得当前对象的锁(该方式和方式1作用相同)。 5. 修饰 xxx.class,(该方式和方式2作用相同)。     2.锁竞争说明 同时调用两个都加有synchron ...

redis持久化

1、前言 Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。 Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。 由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了 ...
activeMQ的三种通讯模式 publish-subscribe  发布订阅模式有点类似于我们日常生活中订阅报纸。每年到年尾的时候,邮局就会发一本报纸集合让我们来选择订阅哪一个。在这个表里头列了所有出版发行的报纸,那么对于我们每一个订阅者来说,我们可以选择一份或者多份报纸。比如北京日报、潇湘晨报等。那么这些个我们订阅的报纸,就相当于发布订阅模式里的topic。有很多个人订阅报纸,也有人可能和我订阅了相同的报纸。那么,在这里,相当于我们在同一个topic里注册了。对于一份报纸发行方来说,它和所有的订阅者就构成了一个1对多的关系。 p2p     p2p的过程则理解起来更加简单。它好比是两个 ...

sql优化

- 避免使用select * - count(1)或count(列) 代替 count(*) - 创建表时尽量时 char 代替 varchar - 表的字段顺序固定长度的字段优先 - 组合索引代替多个单列索引(经常使用多个条件查询时) - 尽量使用短索引 - 使用连接(JOIN)来代替子查询(Sub-Queries) - 连表时注意条件类型需一致 - 索引散列值(重复少)不适合建索引,例:性别不适合 索引原理 本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。 索引的数据结构 ...
执行效果上:   count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL   count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL   count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计 执行效率上:   列名为主键,count(列名)会比count(1)快   列名不为主键,count(1)会比count(列名)快   如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)   如果有主键 ...
Global site tag (gtag.js) - Google Analytics