- 博客(78)
- 资源 (4)
- 收藏
- 关注
原创 发糖果问题
老师想给孩子们分发糖果,有 N个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/candy著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。https://leetcod..
2021-04-22 17:08:27
258
原创 mysql insert 隐式锁的问题分析
1、什么是隐式锁?隐式锁是一种乐观锁,只在必要的时候加锁。比如insert的时候,默认是不会加锁的,InnoDB的每条记录中都一个隐含的trx_id字段,这个字段存在于聚簇索引的B+Tree中。插入后会保存当前事务ID。如果后面有其他事务要对这个记录加排他锁时,将由这个事务将这个记录增加前面一个事物的显示锁。2、insert如何加锁?insert加隐式锁,也就是在主键索引里...
2019-10-25 17:44:45
817
原创 索引失效场景
1、B-Tree可以对<,<=,=,>,>=,BETWEEN,IN,以及不以通配符开始的LIKE使用索引。2、存储引擎不能使用索引中范围条件右边的列。例如,如果你的查询语句为WHERE last_name="Smith" AND first_name LIKE 'J%' AND dob='1976-12-23',则该查询只会使用索引中的前两列,因为LIKE是范围查询。...
2019-10-25 17:43:12
209
原创 事务隔离级别实现原理和锁-InnoDB存储引擎
1、隔离级别的种类RU:未提交读RC:读提交RR:可重复读 (默认)Series:串行化2、锁的种类行锁,gap lock, next-key lock共享锁,排他锁,意向共享锁,意向排他锁,插入意向锁意向锁(插入意向锁不包括)之间互相兼容,可以说意向锁就是为了提高锁判断的效率的。两个事务都对同一个表加意向排他锁,也就是两个事务都是修改数据,那么底层的行...
2019-10-25 17:42:26
398
原创 where 条件加锁分析
本文前提where提取Index keyIndex FilterTable Filter有什么用?参考文章本文前提基于InnoDB存储引擎 当前读where提取提取为三部分:Index Key, Index Filter, Table FilterIndex keyIndex First Key:用于确定索引查询的起始...
2019-10-25 17:40:35
511
原创 Myisam和InnoDB的区别
不同点:InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主...
2019-10-25 17:38:31
232
原创 mysql自增主键的锁问题
每个带有自增属性的表都有一个隐式计数器来维护自增ID到了什么值。在插入的时侯通过加表锁来更新这个计数器。插入完成后就释放,并不是等到事务结束。但是这严重影响了程序的并发性,尤其是在执行insert .... select的时候会阻塞其他事务的插入。所以mysql 5.1.22进行了优化,对于确定数量的插入simple inserts通过互斥量来做到的。MySQL 5.1.22开始,I...
2019-10-25 17:35:45
1085
原创 TCP粘包和常用解决方案
0、现象1、产生的原因根因:无消息保护边界。面向流的。具体原因:1、nagle算法为了提高发送效率2、mtu限制数据链路层限制,导致发送端拆包3、recvbuf接收端缓冲区。或者进程处理不及时会导致粘包2、解决的办法1、固定长度2、固定分隔符3、头+body,头部包含data长度参考文章:https://blog.csdn.net/u013857458/articl...
2019-10-08 16:55:09
120
原创 epoll poll select区别
select :1.每次调用 select(),都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大,同时每次调用 select() 都需要在内核遍历传递进来的所有 fd,这个开销在 fd 很多时也很大。2.单个进程能够监视的文件描述符的数量存在最大限制,在 Linux 上一般为 1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低...
2019-05-16 22:34:26
285
1
原创 n人围成一圈报数
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位import java.util.LinkedList;import java.util.List;/** * @author Golphing.W * @date 19/5/14 下午3:08 */public class Test { ...
2019-05-14 17:34:45
345
原创 nginx location匹配顺序
location:语法:location [=|~|~*|^~] /uri/如果使用正则表达式,你必须使用 ~* 前缀选择不区分大小写的匹配或者 ~ 选择区分大小写的匹配。使用正则表达式必须使用这个前缀如果使用的是普通字符串匹配则不需要使用 “=”前缀,将只执行严格匹配。如果这个查询匹配,那么将停止搜索并立即处理这个请求。总结,指令按下列顺序被接受:
2016-07-18 18:53:17
509
1
原创 Spring DI
spring中有三种依赖注入的方式: 1、构造器注入 2、setter方法注入 主要是通过反射,调用setter方法将值注入进去 3、属性注入(注解的方式)属性注入 需要增加命名空间, @Resource默认按名称装载,没有的时候按类型 名称就是字段名 @Autowired默认按类型装载
2016-06-15 08:49:02
1073
原创 getClass()方法
/** * @author hzwanggaoping * 统计 */public class sdfasf {public static void main(String[] args) {Person p = new Student();System.out.println(p.getClass());System.out.println(p.getClass(
2016-06-14 14:46:34
548
转载 关于java的多态方法调用顺序的问题
使用父类类型的引用指向子类的对象,该引用调用的师父类中定义的方法和变量,变量不能被重写(覆盖);如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法; 注意特殊情况,如果该父类引用所调用的方法参数列表未定义,就调用该父类的父类中查找,如果还没找到就强制向上类型转换参数列表中的参数类型,具体优先级高到低依次如下:this.show(O)、sup
2016-03-01 17:29:01
4519
2
转载 细聊分布式ID生成方法
一、需求缘起几乎所有的业务系统,都有生成一个记录标识的需求,例如:(1)消息标识:message-id(2)订单标识:order-id(3)帖子标识:tiezi-id这个记录标识往往就是数据库中的唯一主键,数据库上会建立聚集索引(cluster index),即在物理存储上以这个字段排序。 这个记录标识上的查询,往往又有分页或者排序的业务
2016-02-23 15:16:03
475
原创 java nio初探
在讲java nio之前,先讲一下io模型,我也是刚刚在网上看的博客学习的,在这里总结一下,有理解不正确的地方,欢迎指正。同步,异步,阻塞,非阻塞首先讲一下我们经常听到的几个名词:同步,异步,阻塞,非阻塞同步指的是有多个任务的时候,需要一件件的按顺序执行,不能穿插进行。异步就是可用同时进行。阻塞指的是在做某件事情的时候,发现条件不足,但是线程会一直等待直到满足条件。而非阻塞则是在条
2016-02-19 16:15:21
366
原创 关于gitignore文件,Myeclipse和IDEA的编译输出文件的问题
使用git做版本管理时,有的.class文件非常繁琐,比如你创建了一个工程,用git做版本管理,每次的class文件内容都不一样啊,这个东西又没有什么必要管理,还有,多人协作开发时用的IDE不一样的时候,一些IDE的配置文件,这些都不希望上传到版本库,这时,gitignore文件就起作用啦,比如:我的gitignore文件内容如下:# Maventarget/*.ser*.ec#
2015-10-22 15:17:24
1994
原创 整理下git常用命令
git status -sgit branchgit pullgit add .git commit -m “msg”git checkout branchnamegit merge brachnamegit log --pretty=oneline版本回退:git reset --hard HEAD^ 内容也是要回退的 git reset --ha
2015-10-22 09:23:22
523
1
转载 线程池原理(讲的非常棒)
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任
2015-10-10 23:01:21
35491
4
原创 Java并发编程:阻塞队列
在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了
2015-10-10 09:43:59
420
转载 Future,FutureTask,Callable,Runnable的用法
创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。
2015-10-08 17:00:50
511
转载 Java并发编程:Timer和TimerTask(转载)
下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样:123456
2015-10-08 12:31:45
330
转载 Java并发编程:并发容器之CopyOnWriteArrayList(转载)
原文链接: http://ifeve.com/java-copy-on-write/http://www.cnblogs.com/dolphin0520/p/3938914.html Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出
2015-10-07 12:13:43
375
转载 java并发之ConcurrentHashMap
ConcurrentHashMap为了提高本身的并发能力,在内部采用了一个叫做Segment的结构,一个Segment其实就是一个类Hash Table的结构,Segment内部维护了一个链表数组,我们用下面这一幅图来看下ConcurrentHashMap的内部结构:
2015-10-06 16:30:55
536
转载 java Unsafe类的compareAndSwap方法
compareAndSwap是个原子方法,原理是cas.就是说如果他是xx,那么就改为xxx. 这个是高效,而且是原子的,不用加锁. 也不用但是其他值改了而产生误操作,应为会先判断当前值,符合期望才去改变. 直接上代码吧 Java代码 package com.huangyunbin; import java.lang.reflect.Fiel
2015-10-06 15:28:51
860
转载 java中的同步容器和并发容器
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vecto
2015-09-30 17:03:23
418
原创 ConcurrentModificationException异常原因
首先举ConcurrentModificationException的例子:public static void main(String[] args) { List list=new ArrayList(); list.add(4); list.add(5); list.add(3); list.add(2); for(Integ
2015-09-30 15:59:55
339
转载 Lock和synchronized的选择
总结来说,Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现; 2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要
2015-09-29 17:23:57
412
原创 关于java线程的interrupt方法的使用总结
首先要说明的就是Lock,通过查看Lock的源码可知,Lock是一个接口:12345678public interface Lock { void lock(); void lockInterruptibly() throws InterruptedExc
2015-09-29 11:22:16
669
原创 进程通信方式
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共
2015-09-16 15:12:24
290
转载 多线程vs多进程
多线程的最主要优点是:共享数据方便(都在一个地址空间,不需要IPC);可移植性好。 多进程的最主要优点是:可靠性较高(进程间彼此隔绝,一个进程被OOXX不会影响其他进程);能够在外部监控(因为进程是操作系统分配资源的对象)。 开发难度:多线程比较简单,因为不用去搞体位繁多的IPC,故不容易被不熟悉的API阴到。 调试难度:都很麻烦,是开发者的噩梦。所以需要多些单元测试
2015-09-16 11:23:19
304
转载 java异常处理机制
Thorwable类是所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。其中异常类Exception又分为 运行时异常RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。Error与Exception Err
2015-09-09 21:17:40
258
转载 java为什么使用nio
Java中普通的I/O功能 一般体现在 1.文件读写、2.网络传输、3.字节流输入/输出 应用场景。而Java中的 NIO 提高了原有I/O的性能。Java的NIO包含以下特性: 1.内存映射到文件 2.文件锁定 3.字符集编码和锁码 4.非阻塞的输入/输出Java的NIO目前运用最广泛的在Apache的Tomcat6中,1.减少了服务器在瞬间达到峰值的
2015-09-06 20:34:56
688
转载 如何停止JAVA线程
1. 使用退出标志终止线程 当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){……}来处理。但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boole
2015-09-05 23:09:21
403
原创 HashMap存储机制及扩容
首先要说的是hashmap的底层数据结构是数组+链表的结构。hashmap中有一个entry内部类,内部类有几个属性:key,value,hash,next。hashmap中的数组其实也就是entry数组。hashmap的初始容量是16,如果赋值初始容量的话,也是会自动变成2的幂这种大小的。为什么需要时2的幂?这是运算的简便,为了使按位与和取模运算结果一致。resi
2015-09-05 22:43:21
905
原创 Collections分析之SynchronizedList
Collections中有SynchronizedList方法@ThreadSafe class GoodListHelper { public List list = Collections.synchronizedList(new ArrayList()); public boolean putIf
2015-09-04 23:56:28
530
原创 乐观锁与CAS操作
AtomicInteger来研究在没有锁的情况下是如何做到数据正确性的?这里举例说明一个方法:getAndIncrementpublic final int getAndIncrement() { for (;;) { int current = get(); int next = current + 1;
2015-09-04 21:34:57
640
原创 悲观锁和乐观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所
2015-09-04 17:33:53
555
转载 httpclient模拟登陆,不支持https的问题
最近在写一个小项目,需要去51job和智联上抓取个人简历,所以就需要模拟登录。。真真是折腾了一番啊,不过对于http倒是多了一点了解。不多说,先copy代码,还要接着去写呢。import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustMan
2015-08-19 11:44:42
851
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人