在多线程中并发写入文件
Concurrent write to a file in multithreading
我是并发编程新手,读过同步和锁。
我知道我们可以一次写一个。
但是我的要求是:
1. 不同键值并发写入
2. 仅在键级别锁定,即如果一个线程正在对 key1 执行写操作,则 key1 的另一个线程应该等待
对于此实施使用哪个选项有什么建议吗?
我在 vetx 框架中使用 KeyValueLib Class
您可以拥有多把锁,并为每把钥匙分别使用一把唯一的锁。例如:
public class MultipleKeyExample{
private Object lock1=new Object();
private Object lock2=new Object();
private int x,y;// these could be your keys
......
public void setX(int x){
synchronized(lock1){
this.x=x;
}
}
public void setY(int y){
synchronized(lock2){
this.y=y;
}
}
public int getX(){
synchronized(lock1){
return x;
}
}
public int getY(){
synchronized(lock2){
return y;
}
}
}
尽管我个人更喜欢 Java 的并发实用程序中的锁。
您可以使用 ReentrantReadWriteLock
。您可以将上面的代码更改为:
public class MultipleKeyExample{
private ReadWriteLock lock1=new ReentrantReadWriteLock();
private ReadWriteLock lock2=new ReentrantReadWriteLock();
private int x,y;
......
public void setX(int x){
lock1.writeLock().lock();
this.x=x;
lock1.writeLock().unlock();
}
public void setY(int y){
lock2.writeLock().lock();
this.y=y;
lock2.writeLock().unlock();
}
public int getX(){
lock1.readLock().lock();
return x;
lock1.readLock().unlock();
}
public int getY(){
lock2.readLock().lock();
return y;
lock2.readLock().unlock()
}
}
编辑:
如果您不想预定义键的数量,您可以为每个键创建对象,并将它们存储在集合框架数据结构中。或者更简单地说,使用像 ConcurrentHashTable
.
这样的并发数据结构
希望这对您有所帮助。
我是并发编程新手,读过同步和锁。 我知道我们可以一次写一个。 但是我的要求是: 1. 不同键值并发写入 2. 仅在键级别锁定,即如果一个线程正在对 key1 执行写操作,则 key1 的另一个线程应该等待
对于此实施使用哪个选项有什么建议吗?
我在 vetx 框架中使用 KeyValueLib Class
您可以拥有多把锁,并为每把钥匙分别使用一把唯一的锁。例如:
public class MultipleKeyExample{
private Object lock1=new Object();
private Object lock2=new Object();
private int x,y;// these could be your keys
......
public void setX(int x){
synchronized(lock1){
this.x=x;
}
}
public void setY(int y){
synchronized(lock2){
this.y=y;
}
}
public int getX(){
synchronized(lock1){
return x;
}
}
public int getY(){
synchronized(lock2){
return y;
}
}
}
尽管我个人更喜欢 Java 的并发实用程序中的锁。
您可以使用 ReentrantReadWriteLock
。您可以将上面的代码更改为:
public class MultipleKeyExample{
private ReadWriteLock lock1=new ReentrantReadWriteLock();
private ReadWriteLock lock2=new ReentrantReadWriteLock();
private int x,y;
......
public void setX(int x){
lock1.writeLock().lock();
this.x=x;
lock1.writeLock().unlock();
}
public void setY(int y){
lock2.writeLock().lock();
this.y=y;
lock2.writeLock().unlock();
}
public int getX(){
lock1.readLock().lock();
return x;
lock1.readLock().unlock();
}
public int getY(){
lock2.readLock().lock();
return y;
lock2.readLock().unlock()
}
}
编辑:
如果您不想预定义键的数量,您可以为每个键创建对象,并将它们存储在集合框架数据结构中。或者更简单地说,使用像 ConcurrentHashTable
.
希望这对您有所帮助。