摘要:
一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:1、为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。2、当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔... 阅读全文
摘要:
一、ThreadPoolExecutor的重要参数 corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 设置allowCoreThreadTimeout=true... 阅读全文
摘要:
在Java中,我们一般通过集成Thread类和实现Runnnable接口,调用线程的start()方法实现线程的启动。但如果并发的数量很多,而且每个线程都是执行很短的时间便结束了,那样频繁的创建线程和销毁进程会大大的降低系统运行的效率。线程池正是为了解决多线程效率低的... 阅读全文
摘要:
1、ABA问题 如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间他的值可能被改为其他值,然后又改回A,那CAS操作就会误认为它从来没被修改过。这个问题被称为C... 阅读全文
摘要:
1、版本号机制 一般是在数据表中加上一个版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读到的version值与当前数据库中的versi... 阅读全文
摘要:
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其他线程阻塞,用完后再把资源转让给其他线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁... 阅读全文
摘要:
sychronized与volatile关键字区别:1、volatle关键字解决的是变量在多个线程之间的可见性;而sychronized关键字解决的是多个线程之间访问共享资源的同步性。2、volatile只能用于修饰变量,而synchronized可以修饰方法以及代码... 阅读全文
摘要:
链接:https://www.nowcoder.com/discuss/113050阿里一面20min 说项目,说平常怎么学习java,说除了项目有自己开发过什么。问基础分代回收算法对象分类 这种算法并不是一种新的算法,而是根据对象的存活周期的不同而将内存分为几... 阅读全文
摘要:
对象优先在新生代的eden区分配内存,但是也并不绝对,下面几种情况对象会晋升到老年代。1、大对象直接进入老年代。比如很长的字符串,或者很大的数组等。2、长期存活的对象进入老年代。在堆中分配内存的对象,其内存布局的对象头中包含了GC分代年龄标记信息。如果对象在eden区... 阅读全文
摘要:
对象分类 这种算法并不是一种新的算法,而是根据对象的存活周期的不同而将内存分为几块,分别是新生代、老年代和永久代。新生代:朝生夕灭的对象(例如方法的局部变量等);老年代:存活的比较久但还是要死的对象(例如缓存对象、单例对象等);永久代:对象生成后几乎不灭的对象(... 阅读全文