Lock鎖之重入鎖與讀寫鎖
Lock鎖
重入鎖ReentrankLock的使用:
package Lock;
import java.util.Arrays;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrankLocktest {
Lock lock=new ReentrantLock();
String[] s= {"A","B","","","",""};
int index=2;
public void add(String str) {
lock.lock();
try {
s[index]=str;
index++;
System.out.println(Thread.currentThread().getName()+"新增了"+str);
}finally {
lock.unlock();
}
}
public String[] get() {
return s;
}
}
package Lock;
import java.util.Arrays;
public class test {
public static void main(String[] args) {
ReentrankLocktest locks=new ReentrankLocktest();
new Thread(new Runnable() {
@Override
public void run() {
locks.add("hello");
}}).start();
new Thread(new Runnable() {
@Override
public void run() {
locks.add("world");
}}).start();
System.out.println(Arrays.asList(locks.s));
}
}
讀寫鎖ReentrankReadWriteLock的使用:
- 一寫多讀同步鎖,讀寫分離,可分別分配讀鎖和寫鎖。
- 支援多次分配讀鎖,使多個讀鎖併發執行。
互斥規則: - 寫-寫互斥
- 讀-寫互斥
- 讀-讀不互斥
package Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
public class ReentrankReadWriteLockTest {
//讀寫鎖
private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
//讀鎖
private ReadLock read=lock.readLock();
//寫鎖
private WriteLock write=lock.writeLock();
private String value;
//寫操作
public void set(String value) {
write.lock();
try {
System.out.println(Thread.currentThread().getName()+"寫入:"+value);
this.value=value;
}finally {
write.unlock();
}
}
//讀操作
public String get() {
read.lock();
try {
System.out.println(Thread.currentThread().getName()+"讀取:"+this.value);
return this.value;
}finally {
read.unlock();
}
}
}
``
package Lock;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class test1 {
public static void main(String[] args) {
ReentrankReadWriteLockTest wr=new ReentrankReadWriteLockTest();
//建立執行緒池
ExecutorService es=Executors.newFixedThreadPool(10);
//把任務交給執行緒池
//寫操作2個執行緒
es.submit(new Runnable() {
@Override
public void run() {
for(int i=0;i<2;i++) {
wr.set("hello world");
}
}});
//讀操作8個執行緒
es.submit(new Runnable() {
@Override
public void run() {
for(int i=0;i<8;i++) {
wr.get();
}
}
});
//釋放資源
es.shutdown();
}
}
相關文章
- Lock介面、重入鎖ReentrantLock、讀寫鎖ReentrantReadWriteLockReentrantLock
- 淺談Java中的鎖:Synchronized、重入鎖、讀寫鎖Javasynchronized
- Java併發-顯式鎖篇【可重入鎖+讀寫鎖】Java
- 可重入鎖與不可重入鎖理解
- 【JavaSE】Lock鎖和synchronized鎖的比較,lock鎖的特性,讀寫鎖的實現。Javasynchronized
- 自旋鎖、阻塞鎖、可重入鎖、悲觀鎖、樂觀鎖、讀寫鎖、偏向所、輕量級鎖、重量級鎖、鎖膨脹、物件鎖和類鎖物件
- Java併發基礎-鎖的使用及原理(可重入鎖、讀寫鎖、內建鎖、訊號量等)Java
- 死鎖和可重入鎖
- 讀寫鎖 ReentrantReadWriteLock 與 互斥鎖 的效率
- MySQL MyISAM引擎的讀鎖與寫鎖MySql
- java重入鎖、公平鎖和非公平鎖Java
- 可重入鎖
- redis分散式鎖-可重入鎖Redis分散式
- 併發程式設計系列之Lock鎖可重入性與公平性程式設計
- ReentrantLock可重入鎖、公平鎖非公平鎖區別與實現原理ReentrantLock
- Lock 鎖
- 讀寫鎖
- Java併發程式設計之鎖機制之(ReentrantLock)重入鎖Java程式設計ReentrantLock
- 【java併發程式設計】ReentrantLock 可重入讀寫鎖Java程式設計ReentrantLock
- Redisson 分散式鎖原始碼 01:可重入鎖加鎖Redis分散式原始碼
- 重入鎖的理解
- 分散式鎖-Redission-Lock鎖的使用與原理分散式Redis
- JUC之讀寫鎖問題
- Java 中15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖,樂觀鎖,分段鎖,自旋鎖等等Java
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等Java
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等...Java
- 讀寫鎖 ReentrantReadWriteLock
- Java併發程式設計之鎖機制之ReentrantReadWriteLock(讀寫鎖)Java程式設計
- mysql innodb lock鎖之record lock之一MySql
- synchronized鎖重入問題synchronized
- MySQL鎖(讀鎖、共享鎖、寫鎖、S鎖、排它鎖、獨佔鎖、X鎖、表鎖、意向鎖、自增鎖、MDL鎖、RL鎖、GL鎖、NKL鎖、插入意向鎖、間隙鎖、頁鎖、悲觀鎖、樂觀鎖、隱式鎖、顯示鎖、全域性鎖、死鎖)MySql
- 原始碼分析:ReentrantReadWriteLock之讀寫鎖原始碼
- ZooKeeper 分散式鎖 Curator 原始碼 03:可重入鎖併發加鎖分散式原始碼
- ZooKeeper 分散式鎖 Curator 原始碼 02:可重入鎖重複加鎖和鎖釋放分散式原始碼
- ZooKeeper 分散式鎖 Curator 原始碼 01:可重入鎖分散式原始碼
- ReentrantReadWriterLock原始碼(state設計、讀寫鎖、共享鎖、獨佔鎖及鎖降級)原始碼
- MySQL 共享鎖 (lock in share mode),排他鎖 (for update)MySql
- Java讀寫鎖ReadWriteLockJava