ConcurrentHashMap实现的代码实例
时间: 2023-10-14 19:24:54 浏览: 39
下面是一个简单的基于ConcurrentHashMap实现的线程安全的计数器示例代码:
```java
import java.util.concurrent.ConcurrentHashMap;
public class Counter {
private ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
public void increment(String key) {
map.putIfAbsent(key, 0);
map.compute(key, (k, v) -> v + 1);
}
public int get(String key) {
return map.getOrDefault(key, 0);
}
}
```
使用ConcurrentHashMap实现的计数器具有较好的线程安全性和高并发性能。在多个线程同时调用increment方法时,ConcurrentHashMap能够保证每个线程操作的key-value对不会相互干扰,从而实现线程安全的计数器功能。
相关问题
springboot本地缓存ConcurrentLinkedHashMap实现
Spring Boot 是一个开源的Java框架,它能够帮助开发者快速构建基于Spring的应用程序。为了提高应用程序的性能,Spring Boot提供了本地缓存的支持。本文将介绍如何使用ConcurrentLinkedHashMap实现Spring Boot的本地缓存。
ConcurrentLinkedHashMap是一个线程安全的LRU缓存实现,它基于ConcurrentHashMap和LinkedHashMap。ConcurrentLinkedHashMap提供了以下特性:
1. 线程安全:ConcurrentLinkedHashMap是线程安全的,多个线程可以同时读写缓存。
2. LRU策略:ConcurrentLinkedHashMap使用LRU策略来管理缓存,当缓存满了之后,会将最近最少使用的缓存项删除。
3. 容量控制:ConcurrentLinkedHashMap提供了可配置的容量控制,开发者可以通过设置最大缓存大小来控制缓存的容量。
下面是使用ConcurrentLinkedHashMap实现Spring Boot本地缓存的步骤:
步骤1:添加依赖
在pom.xml文件中添加以下依赖:
```
<dependency>
<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
<artifactId>concurrentlinkedhashmap-lru</artifactId>
<version>1.4.2</version>
</dependency>
```
步骤2:创建缓存类
创建一个缓存类,它包含了ConcurrentLinkedHashMap实例和相关的方法。
```
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class CacheService {
private final Map<String, Object> cache;
public CacheService() {
cache = new ConcurrentLinkedHashMap.Builder<String, Object>()
.maximumWeightedCapacity(1000)
.build();
}
public void put(String key, Object value) {
cache.put(key, value);
}
public Object get(String key) {
return cache.get(key);
}
public void remove(String key) {
cache.remove(key);
}
public void clear() {
cache.clear();
}
}
```
在上面的代码中,我们创建了一个CacheService类,它包含了ConcurrentLinkedHashMap实例和相关的方法。在构造函数中,我们使用ConcurrentLinkedHashMap.Builder创建了一个ConcurrentLinkedHashMap实例,并设置了最大容量为1000。
put、get、remove和clear方法分别用于向缓存中添加、获取、删除和清空数据。
步骤3:使用缓存类
在需要使用缓存的地方,我们可以通过依赖注入的方式获取CacheService实例,并使用其提供的方法进行缓存操作。
```
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private CacheService cacheService;
@GetMapping("/cache/{key}")
public Object cache(@PathVariable String key) {
Object value = cacheService.get(key);
if (value == null) {
// 查询数据库或其他操作
value = "data from db";
cacheService.put(key, value);
}
return value;
}
}
```
在上面的代码中,我们注入了CacheService实例,并在cache方法中使用了它的get和put方法进行缓存操作。如果缓存中不存在指定的key,则查询数据库或其他操作,然后将结果存入缓存中。
这样,我们就使用ConcurrentLinkedHashMap实现了Spring Boot的本地缓存。ConcurrentLinkedHashMap提供了线程安全、LRU策略和容量控制等特性,能够帮助我们提高应用程序的性能。
写一段Java代码实现byte[]数据的缓存,要求高性能,线程安全
### 回答1:
public class ByteCache {
private ConcurrentHashMap<String, byte[]> cacheMap = new ConcurrentHashMap<>(); public void put(String key, byte[] data) {
if (key != null && data != null) {
cacheMap.put(key, data);
}
} public byte[] get(String key) {
if (key != null) {
return cacheMap.get(key);
}
return null;
}
}
### 回答2:
要实现byte[]数据的高性能、线程安全的缓存,可以使用ConcurrentHashMap和ReadWriteLock来进行实现。具体的Java代码如下所示:
```java
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ByteArrayCache {
private ConcurrentHashMap<String, byte[]> cache;
private ReadWriteLock lock;
public ByteArrayCache() {
cache = new ConcurrentHashMap<>();
lock = new ReentrantReadWriteLock();
}
public void put(String key, byte[] value) {
lock.writeLock().lock();
try {
cache.put(key, value);
} finally {
lock.writeLock().unlock();
}
}
public byte[] get(String key) {
lock.readLock().lock();
try {
return cache.get(key);
} finally {
lock.readLock().unlock();
}
}
public boolean containsKey(String key) {
lock.readLock().lock();
try {
return cache.containsKey(key);
} finally {
lock.readLock().unlock();
}
}
public void remove(String key) {
lock.writeLock().lock();
try {
cache.remove(key);
} finally {
lock.writeLock().unlock();
}
}
public int size() {
lock.readLock().lock();
try {
return cache.size();
} finally {
lock.readLock().unlock();
}
}
}
```
上述代码中,使用ConcurrentHashMap作为缓存数据的容器,它是线程安全的HashMap实现类。并通过ReadWriteLock来保证在读取和写入缓存时的线程安全。具体来说,当需要写入缓存时,获取写锁(lock.writeLock())并在操作完成后释放写锁;当需要读取缓存时,获取读锁(lock.readLock())并在操作完成后释放读锁。这种读写锁的机制可以使得多个线程可以同时读取缓存,从而提高性能。
使用上述代码可以实现一个高性能、线程安全的byte[]数据缓存,可以通过put方法将数据存入缓存,通过get方法获取缓存中的数据,并提供了其他常见的缓存操作方法,例如删除缓存(remove)和获取缓存大小(size)等。
### 回答3:
下面是一个使用Java实现高性能、线程安全的byte[]数据缓存的示例代码:
```java
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ByteCache {
private static Map<String, byte[]> cache = new ConcurrentHashMap<>();
public static void put(String key, byte[] value) {
cache.put(key, value);
}
public static byte[] get(String key) {
return cache.get(key);
}
public static void remove(String key) {
cache.remove(key);
}
public static void clear() {
cache.clear();
}
public static boolean containsKey(String key) {
return cache.containsKey(key);
}
}
```
在这个示例代码中,使用`ConcurrentHashMap`来存储缓存的数据。它是线程安全的哈希表实现,并发访问时可以提供良好的性能。
你可以使用`put`方法将byte[]数据添加到缓存中,使用`get`方法从缓存中获取指定key对应的数据。`remove`方法用于从缓存中删除指定key的数据。`clear`方法用于清空缓存中的所有数据。`containsKey`方法用于检查缓存是否包含指定的key。
注意,示例代码中的`cache`对象是静态的,这样你就可以在不同的类和线程中使用`ByteCache`类来操作同一个缓存。如果你需要多个独立的缓存,你可以将`cache`对象改为实例变量。
希望这个示例代码能够帮助你实现一个高性能、线程安全的byte[]数据缓存。