自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 Redis

为啥 redis 单线程模型也能效率这么高? 纯内存操作。 核心是基于非阻塞的 IO 多路复用机制。 C 语言实现,一般来说,C 语言实现的程序“距离”操作系统更近,执行速度相对会更快。 单线程反而避免了多线程的频繁上下文切换问题,预防了多线程可能产生的竞争问题。 redis 过期策略定期删除:redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。惰性删除:获取时redis检查该key是否过期,如果过期则删

2021-09-01 16:52:14 117

原创 四种线程池

#### newCachedThreadPool1. 创建一个可缓存的线程池2. 工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。3. 如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果又提交了新的任务,则线程池重新创建一个工作线程。4. 适用:执行很多短期异步的小任务#### newFixedThreadPool1. 创建一个指定工作线程数量的线程池2. 每当提交一个任

2021-06-09 11:02:55 104

原创 IDEA你不得不知道的快捷键

功能 配置 使用 说明 自动补全 Keymap:Completion-Basic 在想要提示的地方按快捷键可以强制提示 有些函数入参为λ表达式的时候,可以用此方法帮你补全 文本格式转换:下划线<=>驼峰 需要安装插件CamelCase 选中想要修改的文本,快捷键shift+alt...

2021-04-17 17:04:49 432

原创 JVM GC

收集器的配合使用收集器分类收集器 适用分代 特性 算法 优势 劣势 Serial 新生代 串行 复制算法 1、简单高效 2、单核CPU适用 Serial Old 老年代 标记-压缩算法 ParNew 新生代 并行,只是Serial的多线程版本,底层共用代码 复制算法 1、多核CPU适用 2、减少STW时间 Parallel Scavenge 新...

2021-04-07 17:55:13 92

原创 myBatis + log4j简单实例

代码段//根据xml创建SqlSessionFactory对象String resource = "mybatisConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactory...

2019-12-21 09:49:28 94

原创 按数组内容及位置更新数据库表

在进行业务开发时,遇见一个需求,从前端返回一个list的ids,要按照ids去从数据库中查找,然后将它的列属性-优先级更新为该id在ids的位置。例如:ids=[3, 6 ,2],则将id为3、6、2的条目的优先级列设置成对应位置的1、2、3。同时不能在代码中有循环,只能与数据库有一次连接。这也就意味着只能把循环写在mapper.xml中。然后就有了以下两种解决方案:一次发多条sql语...

2019-12-21 09:44:34 252

原创 spring mvc 各种注解

@RequestMapping建立请求URL和处理请求方法之间的对应关系,可以放在类上或者方法上。@RequestMapping("/account") //表示请求的一级目录public class AccountController { @RequestMapping("/findAccount") //表示请求的二级目录...

2019-12-21 09:33:10 73

原创 spring mvc 简单实例

启动服务器,加载配置文件(web.xml)配置DispatcherServlet对象(<servlet>标签) 加载springmvc.xml(beans配置) 开启注解扫描,创建Controller对象(@Controller注解生效) 创建视图解析器对象(InternalResourceViewResolver) 开启springMVC框架注解的支持(@Req...

2019-12-21 09:33:04 108

原创 spring AOP总结

通配符* 匹配任意数量字符 //任意返回值,任意名称,任意参数的公共方法execution(public * *(..))//匹配com.zejian.dao包及其子包中所有类中的所有方法within(com.zejian.dao..*)+ 匹配给定类的任意子类//匹配实现了DaoUser接口的所有子类的方法within(com.zejian.dao.DaoU...

2019-12-21 09:32:54 98

原创 并发编程 — 6.5 JUC — 同步器

同步器名称 作用 CountDownLatch 倒数计数器,构造时设定计数值,当计数值归零后,所有阻塞线程恢复执行;其内部实现了AQS框架 CyclicBarrier 循环栅栏,构造时设定等待线程数,当所有线程都到达栅栏后,栅栏放行,然后再进行新的一次循环。其内部通过ReentrantLock和Condition实现同步 Semaphore 信号量,类似于“令牌...

2019-12-20 20:09:25 125

原创 并发编程 — 6.4 JUC — 可重入锁

ReentrantLockReentrantLock实现了Lock接口,而ReentrantLock其实相当于一副空壳,它的主要功能就是控制构造出公平锁还是非公平锁,对锁的相关操作细节都是由内部类Sync来完成。Sync继承自AQS(AbstractQueuedSynchronizer),并再衍生出两个内部类非公平锁NofairSync和公平锁FairSync。通过ReentrantLock...

2019-12-20 20:06:52 129

原创 并发编程 — 6.3 JUC — 阻塞同步机制AQS

AbstractQueuedSynchronizer(AQS),即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),它是JUC并发包中的核心基础组件。AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。Node节点AQS维护了一个静态内部类Node,它包含了以下属...

2019-12-20 20:02:21 470

原创 并发编程 — 6.2 JUC — 锁 Locks

锁是用于控制多线程访问共享资源的工具。通常,锁提供对共享资源的独占访问:一次只有一个线程可以获取锁,对共享资源的所有访问都需要首先获取锁。但是,一些锁可以允许同时访问共享资源,例如读写锁ReadWriteLock。锁的分类a.悲观锁与乐观锁悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每...

2019-12-20 19:56:47 119

原创 并发编程 — 6.1 JUC — 非阻塞同步机制CAS

CAS的作用在多线程并发下,可以通过加锁来保证线程安全性,但多个线程同时请求锁,而线程的挂起和恢复会有很大的开销。一些细粒度的操作,例如同步容器,操作往往只有很少代码量,如果存在锁并且线程激烈地竞争,调度的代价很大。在硬件的支持下,出现了非阻塞的同步机制,其中一种常用实现就是CAS。CAS说明CAS(compare and swap,比较并交换)操作包含三个操作数 —— 内存位置(V)...

2019-12-20 19:55:04 109

原创 并发编程 — 5. Unsafe类

Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。可以通过类似 C语言里面的 memcpy 和 memset等函数直接操作对应内存地址的数据。 Unsafe是单例模式,通过调用getUnsafe方法来获取Unsafe实例。但是在方法中通过判断ClassLoader是不是启动类BootStrap ClassLoader来决定是否返回,...

2019-12-20 19:51:37 256

原创 并发编程 — 4. 线程Thread

线程状态java中线程的状态分为6种:初始化(New):当线程完成对象创建后,即new Thread(...),还没有调用start()方法之前,线程处于此状态。 运行态(Runnable):调用start方法,正在jvm中运行,但是可能正在等待操作系统的其他资源。(包含了操作系统的可运行和运行中状态) 阻塞(Blocked):受阻塞,并且正在等待监视器锁。 等待(Waiting):...

2019-12-20 19:48:20 136

原创 并发编程 — 3. synchronized关键字

synchronized的出现打破了volatile关键字的局限性(无法保证原子性和只能修饰单一变量),它可以用来锁住代码块、实例对象、类对象。synchronized的使用a. 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码块前要获得给定对象的锁//Thread类public class MyThread implements Runnable{ private ...

2019-12-20 19:45:15 89

原创 并发编程 — 2. volatile关键字

一个变量被volatile修饰时,它会保证需要写回的值会被立即更新到内存,而读取时也会直接从内存读取新值。 volatile关键字保证了可见性和一定的有序性,而不保证原子性。保证可见性//线程1boolean stop = false;while(!stop){ doSomething();}//线程2stop = true;这段代码通过线...

2019-12-20 19:37:05 96

原创 并发编程 — 1. 三大概念

原子性一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。类似于数据库的事务的原子性,比如在银行转账时,两个账户进行读写操作,若不具有原子性则可能导致意想不到的结果。再举个例子,一个简单的赋值语句 i=9,假若执行到这句话包括两个过程为低16为赋值和为高16为赋值。那么有可能发生一个线程修改完低16位,被中断。另外一个线程又去读取i的值,这时候就会读取到错误...

2019-12-20 19:27:53 176

原创 并发编程 — 0. 前言

在并发编程之前,首先要了解并发问题的本质原因——计算机内存模型 早期CPU还是单核单线程的时候,并不存在并发问题。但随着科技的发展飞速,CPU发展迅速,计算能力也越来越强,但人类对计算能力的需求也越来越高。为了充分利用CPU,引入了超线程(单个cpu核心能模拟出多个线程)和多核心(多个CPU分工共同完成计算)技术。之后就出现了线程并发问题(其本质就是数据不一致问题)。...

2019-12-20 19:02:11 134

原创 函数形参赋值与后置++的特殊问题

我们都知道,函数调用时,先将函数实参按照从右往左的顺序压栈,然后在函数体内,出栈并按照从左往右的顺序给形参赋值。我们也知道,i++是先参与运算再自增,所以x = i++ 就相当于 x = i,  i += 1。有如下代码:从右往左,i自加1变成1,然后赋值给a,b这时候都为1由于i++的特殊机制,使得a位置的栈弹出获取的是i在自加之前保存的值,然后再自加。这也就方便理解...

2018-08-30 17:19:16 1088 2

原创 类存在虚继承,虚函数的内存占用问题

最近在准备找工作,复习的过程中,遇到了求解含有虚继承、虚函数的类的内存大小计算问题(也就是sizeof的结果)。在这里,做一些总结以便后来者更易理解。1、我们知道,一个空类的sizeof值为1.2、加入一个虚函数后,其sizeof值为4,是因为对于类A,编译器为其建立了一个虚表,而A中保存了一份指向虚表的指针,指针就是一个地址,在32位(x86)下,地址的大小为4个字节,所以sizeo...

2018-08-30 16:21:35 1621 2

原创 扩展子集和问题

问题描述:给定一个包含n个整数的数组 set和固定值sum,判断 nums 中是否存在若干个元素 a,b,c ...  使得 a + b + c +...=sum 。找出所有满足条件且不重复的元组。该问题由原问题扩展出来的,适用于求解数组包含任意整数(包含正负零),任意元素组合且和为任意值m的不重复结果。解题思路:1、先将数组 set按照绝对值大小逆排序,将所有0元素放在数组后面2...

2018-08-02 17:19:20 232

原创 配置Win10 + Qt 5.9 MSVC + VS2017

1. Qt的安装Qt官网上已经很难找到想下载的具体版本了,而且还要申请账号,填一堆乱七八糟的东西,这里给出地址:http://download.qt.io/official_releases/qt/5.9/5.9.6/其他版本的Qt也可以找到。目前,qt的安装包不分MingGW和MSVC版本,只有在安装的时候才区分,自行选择。2. VS2017的安装直接官网去下载:https://www.visu...

2018-06-07 15:37:17 5151 1

原创 Mac下配置PATH

用户级:(即给当前用户配置环境变量,文件会在电脑启动时加载)Terminal(终端)命令:1、查看当前PATH值echo $PATH2、生成.bash_profile.swp文件sudo vi ~/.bash_profile回车后输入:I(INSERT) //终端会自动变为INSERT状态3、输入export PATH=$PATH:/user/Qt5

2016-12-23 20:14:38 624

原创 Qt中创建OpenGL基本框架

1、创建Qt设计界面类 2、在.pro文件中加入opengl,以及加入需要用到的LibsQT += core gui openglLIBS += -lglut -lglu32 -lopengl323、修改Widget的父类继承QGLWidget,并导入QGLWidget虚函数initializeGL( )、resizeGL( )、paintGL( )。如有需要其它函数根据实际

2016-11-23 11:36:26 3058

原创 Qt中 QTableWidgetItem设置编辑状态小技巧

通过QTableWidget中的item( )方法可以获得相应行数和列数的QTableWidgetItem,若要设置该Item的编辑状态(即可编辑状态和不可编辑状态),可以通过QTableWidgetItem下的setflags函数来设置。

2016-11-05 23:00:04 12664 1

一图搞懂Java虚拟机(不包含GC部分)

一图搞懂Java虚拟机(不包含GC部分)

2021-04-17

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除