美团小象事业部面试题
1.实现一个简单的生产者消费者模式,上机操作,大家还有别的思路吗?简单明了。
public class ProducerConsumerExample {
private static final int BUFFER_SIZE = 5;
private static BlockingQueue<String> buffer = new ArrayBlockingQueue<>(BUFFER_SIZE);
public static void main(String[] args) {
Thread producerThread = new Thread(new Producer());
Thread consumerThread = new Thread(new Consumer());
producerThread.start();
consumerThread.start();
}
static class Producer implements Runnable {
@Override
public void run() {
Scanner scanner = new Scanner(System.in);
try {
while (true) {
System.out.print("Enter message (type 'exit' to quit): ");
String message = scanner.nextLine();
if ("exit".equalsIgnoreCase(message)) {
break;
}
produce(message);
}
} finally {
scanner.close();
}
}
private void produce(String message) {
try {
buffer.put(message);
System.out.println("Produced: " + message);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
static class Consumer implements Runnable {
@Override
public void run() {
try {
while (true) {
String message = consume();
System.out.println("Consumed: " + message);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
private String consume() throws InterruptedException {
return buffer.take();
}
}
}
2.redis分布式锁的底层原理是什么?
Redis分布式锁的底层原理基于Redis的原子性操作和特性。常见的实现方式有基于SETNX命令(SET if Not eXists)和基于Redlock算法。
SETNX命令实现:
使用SETNX命令可以将键设置为指定的值,仅当键不存在时才能设置成功,若键已存在则设置失败。
实现分布式锁时,可以将一个唯一标识作为锁的键,将某个固定值作为锁的值,设置一个合适的过期时间。
获取锁时,使用SETNX命令尝试设置锁,若设置成功则表示获取锁成功,否则表示锁已被其他客户端持有。
释放锁时,客户端可以通过DEL命令删除锁键,释放资源。
Redlock算法:
Redlock是Redis作者提出的一种分布式锁算法,它通过多个Redis实例来保证锁的可靠性。
在Redlock算法中,一个锁由多个实例的锁组成,当大部分实例获取锁成功时,认为整个锁获取成功。