0
点赞
收藏
分享

微信扫一扫

面经 - 【多线程】在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?


解析:lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像 ConcurrentHashMap 这样的高性能数据结构和有条件的阻塞。Java线程面试的问题越来越会根据面试者的回答来提问。我强烈建议在你去参加多线程的面试之前认真读一下Locks,因为当前其大量用于构建电子交易终统的客户端缓存和交易连接空间。Lock读写锁机制可以实现! 在Java中Lock接口比synchronized块的优势是什么?

Lock接口最大的优势是为读和写分别提供了锁。

package tech.luxsun.interview.luxinterviewstarter.thread;

import java.time.LocalDateTime;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
* @author Lux Sun
* @date 2021/4/11
*/
public class LockDemo {

public static void main(String[] args) {

// 初始化
Cache cache = new Cache();

// 读取
for (int i=0; i<5; i++) {
new Thread(() -> cache.get()).start();
}

// 写入
for (int i=0; i<5; i++) {
new Thread(() -> cache.put(ThreadLocalRandom.current().nextInt(1000))).start();
}
}
}

class Cache {

private Integer data = 0;

private ReadWriteLock rwLock = new ReentrantReadWriteLock();

public void get() {
// try...catch...finally 防止死锁
try {
// 读锁开启, 读进程均可进入
rwLock.readLock().lock();
System.out.println(Thread.currentThread().getName() + "read lock is ready..." + LocalDateTime.now());
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "read data is " + data);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 读锁解锁
rwLock.readLock().unlock();
}
}

public void put(Integer data) {
try {
// 写锁开启, 写进程只允许进一个
rwLock.writeLock().lock();
System.out.println(Thread.currentThread().getName() + "write lock is ready..." + LocalDateTime.now());
Thread.sleep(1000);
this.data = data;
System.out.println(Thread.currentThread().getName() + "write data is " + data);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 写锁解锁
rwLock.writeLock().unlock();
}
}
}
Thread-4read lock is ready...2021-04-11T17:44:57.733
Thread-0read lock is ready...2021-04-11T17:44:57.733
Thread-3read lock is ready...2021-04-11T17:44:57.733
Thread-1read lock is ready...2021-04-11T17:44:57.733
Thread-2read lock is ready...2021-04-11T17:44:57.733
Thread-0read data is 0
Thread-3read data is 0
Thread-2read data is 0
Thread-1read data is 0
Thread-4read data is 0
Thread-8write lock is ready...2021-04-11T17:44:58.735
Thread-8write data is 118
Thread-9write lock is ready...2021-04-11T17:44:59.735
Thread-9write data is 560
Thread-5write lock is ready...2021-04-11T17:45:00.736
Thread-5write data is 333
Thread-7write lock is ready...2021-04-11T17:45:01.737
Thread-7write data is 685
Thread-6write lock is ready...2021-04-11T17:45:02.737
Thread-6write data is 507


举报

相关推荐

0 条评论