Java高频面试专题合集解析:
当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!
更多Java架构进阶资料展示
以版本号方式为例。
版本号方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。
update table set xxx=#{xxx}, version=version+1 where id=#{id} and version=#{version};
CAS操作
=====
CAS(Compare and Swap 比较并交换),当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。
CAS操作中包含三个操作数——需要读写的内存位置(V)、进行比较的预期原值(A)和拟写入的新值(B)。如果内存位置V的值与预期原值A相匹配,那么处理器会自动将该位置值更新为新值B,否则处理器不做任何操作。
悲观锁
===
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如Java里面的同步原语synchronized关键字的实现就是悲观锁。
悲观锁适合写操作非常多的场景,保证数据的安全。
二、独享锁/共享锁
=========
独享锁是指该锁一次只能被一个线程所持有。
共享锁是指该锁可被多个线程所持有。
ReentrantLock
=============
ReentrantLock是独享锁。但是对于Lock的另一个实现类ReadWriteLock,其读锁是共享锁,其写锁是独享锁。
ReadWriteLock
=============
ReadWriteLock,其读锁是共享锁,其写锁是独享锁。读锁的共享锁可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。
Synchronized
============
Synchronized是独享锁
独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享。
三、互斥锁/读写锁
=========
上面讲的独享锁/共享锁就是一种广义的说法,互斥锁/读写锁就是具体的实现。
互斥锁在Java中的具体实现就是ReentrantLock。
读写锁在Java中的具体实现就是ReadWriteLock。
四、可重入锁
======
可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。
ReetrantLock
============
ReetrantLock从名字就可以看出是一个重入锁,其名字是Re entrant Lock 重新进入锁。
Synchronized
============
对于Synchronized而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。
public class AtomicDemo {
// 共享操作的资源 volatile 原子性问题 synchroized Lock AutomicInteger
private static int count = 0 ;
private static Lock lock = new ReentrantLock();
// 定义操作的方法 重入锁
private static void incr(){
try {
lock.lock();// 枷锁
Thread.sleep(1);
count++;
decr();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
private static void decr(){
try {
lock.lock();// 枷锁
Thread.sleep(1);
count–;
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i <100 ; i++) {
new Thread(new Runnable() {
public void run() {
AtomicDemo.incr();
}
}).start();
}
Thread.sleep(5000);
System.out.println(“Result:” + count);
}
}
五、公平锁/非公平锁
总结
其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。
这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来
目录:
部分内容截图:
图片转存中…(img-ySf2QGm6-1715261982136)]