无锁情况
读写操作都是共享的,实际读可以共享,写操作不能共享的,数据不一致。
class MyCathe{
Map<String,String> map = new HashMap<>();
public void Write(String key,String value){
System.out.println(Thread.currentThread().getName()+"准备写入---------");
String string = map.put(key, value);
System.out.println(Thread.currentThread().getName()+"写入完成----------"+string);
}
public void Read(String key){
System.out.println(Thread.currentThread().getName()+"准备读取----------");
String s = map.get(key);
System.out.println(Thread.currentThread().getName()+"读取完成----------"+s);
}
}
public class ReadWriteLockDemo {
public static void main(String[] args) {
MyCathe myCathe = new MyCathe();
for (int i = 0; i <5 ; i++) {
int finalI = i;
int finalI1 = i;
new Thread(()-> {
myCathe.Write(finalI1 +"", finalI1 +"");
},String.valueOf(i)).start();
}
for (int i = 0; i <5 ; i++) {
int finalI = i;
int finalI1 = i;
new Thread(()-> {
myCathe.Read(finalI1 +"");
},String.valueOf(i)).start();
}
}
}
加锁synchronized或者Lock都行(独占锁)。
class MyCathe{
Map<String,String> map = new HashMap<>();
Lock lock = new ReentrantLock();
public void Write(String key,String value){
lock.lock();
try{
System.out.println(Thread.currentThread().getName()+"准备写入---------");
String string = map.put(key, value);
System.out.println(Thread.currentThread().getName()+"写入完成----------"+string);
} finally {
lock.unlock();
}
}
public void Read(String key){
lock.lock();
try{
System.out.println(Thread.currentThread().getName()+"准备读取----------");
String s = map.get(key);
System.out.println(Thread.currentThread().getName()+"读取完成----------"+s);
} finally {
lock.unlock();
}
}
}
public class ReadWriteLockDemo {
public static void main(String[] args) {
MyCathe myCathe = new MyCathe();
for (int i = 0; i <5 ; i++) {
int finalI = i;
int finalI1 = i;
new Thread(()-> {
myCathe.Write(finalI1 +"", finalI1 +"");
},String.valueOf(i)).start();
}
for (int i = 0; i <5 ; i++) {
int finalI = i;
int finalI1 = i;
new Thread(()-> {
myCathe.Read(finalI1 +"");
},String.valueOf(i)).start();
}
}
}
读写锁
public void Write(String key,String value){
readWriteLock.writeLock().lock();
try{
System.out.println(Thread.currentThread().getName()+"准备写入---------");
String string = map.put(key, value);
System.out.println(Thread.currentThread().getName()+"写入完成----------"+string);
} finally {
readWriteLock.writeLock().unlock();
}
}
public void Read(String key){
readWriteLock.readLock().lock();
try{
System.out.println(Thread.currentThread().getName()+"准备读取----------");
String s = map.get(key);
System.out.println(Thread.currentThread().getName()+"读取完成----------"+s);
} finally {
readWriteLock.readLock().unlock();
}
}
}
public class ReadWriteLockDemo {
public static void main(String[] args) {
MyCathe myCathe = new MyCathe();
for (int i = 0; i <5 ; i++) {
int finalI = i;
int finalI1 = i;
new Thread(()-> {
myCathe.Write(finalI1 +"", finalI1 +"");
},String.valueOf(i)).start();
}
for (int i = 0; i <5 ; i++) {
int finalI = i;
int finalI1 = i;
new Thread(()-> {
myCathe.Read(finalI1 +"");
},String.valueOf(i)).start();
}
}
}