原理:
semaphore.acquire(); //获取信号量,假设已经满了,等待信号量可用时被唤醒
semaphore.release();//释放信号量
作用:
多个共享资源互斥的使用!
并发限流,控制最大的线程数
- 示例
停车场
10个位,30辆车
package auxiliaryClass;
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
-
@author ajun
-
Date 2021/7/5
-
@version 1.0
-
信号灯:抢车位
*/
public class SemaphoreTest {
private static final int MAX_PARKING = 10;//最大停车位
private static int cars = 0;//当前停车数量
public static void main(String[] args) throws InterruptedException {
final Semaphore semaphore = new Semaphore(MAX_PARKING);//停车场
Random random = new Random();//计算随机停车时间
for (int i = 1; i <= 30; i++) {//30辆车
TimeUnit.SECONDS.sleep(1);//车辆进场间隔
int t = 10 + random.nextInt(5);//随机停车时间 10 - 15
new Thread(() -> {
try {
semaphore.acquire();//获得车位。如果没有车位,就阻塞等待。
System.out.println(Thread.currentThread().getName() + “号车进场!”);
carsNum(1);//车辆数加1
TimeUnit.SECONDS.sleep(t);//停车时间
System.out.println(Thread.currentThread().getName() + “号车离场了!停了 " + t + " 秒钟”);
carsNum(-1);//车辆数减1
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();//释放车位
}
}, String.valueOf(i)).start();
}
}
//统计当前停车数量和剩余车位
public static void carsNum(int n) {
cars = cars + n;//当前车辆数
int pN = MAX_PARKING - cars;//剩余车位
System.out.println("\n【当前有 " + cars + " 辆车!剩余车位 " + pN + “个】\n”);
}
}
9、读写锁
=====
9.1、简介
ReadWriteLock
包括 读锁 和 写锁
- 读锁
* 也叫 共享锁;一次可以有多个线程占有
- 写锁
* 也叫 独占锁;一次只能由一个线程占有
9.2、用法
类似于 Lock 锁
private ReadWriteLock lock = new ReentrantReadWriteLock();//定义读写锁
lock.readLock().lock();//添加读锁
try {
//业务代码
} finally {
lock.readLock().unlock();//释放读锁
}
lock.writeLock().lock();//添加写锁
try {
//业务代码
} finally {
lock.writeLock().unlock();//释放写锁
}
9.3、示例
package readWriteLock;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
-
@author ajun
-
Date 2021/7/5
-
@version 1.0
-
读写锁
*/
public class Demo01 {
public static void main(String[] args) {
MyCacheLock myCache = new MyCacheLock();//缓存类
//循环写
for (int i = 1; i <= 10; i++) {
final int temp = i;
new Thread(() -> {
myCache.push(“k-”+temp,“v-”+temp);
},String.valueOf(i)).start();
}
//循环读
for (int i = 1; i <= 10; i++) {
final int temp = i;
new Thread(() -> {
myCache.get(“k-”+temp);
},String.valueOf(i)).start();
}
}
}
//自定义