ReentrantLock 除了 synchronized 的功能,多了三个高级功能.
等待可中断,公平锁,绑定多个 Condition.
(1)等待可中断
在持有锁的线程长时间不释放锁的时候,等待的线程可以选择放弃等待. tryLock(long
timeout, TimeUnit unit)
(2)公平锁
按照申请锁的顺序来一次获得锁称为公平锁.synchronized 的是非公平锁,ReentrantLock 可以
通过构造函数实现公平锁. new RenentrantLock(boolean fair)
(3)绑定多个 Condition
通过多次 newCondition 可以获得多个 Condition 对象,可以简单的实现比较复杂的线程同步
的功能.通过 await(),signal();
14、约瑟夫问题知道吗?15 分钟写出来
public class RingTest{
public static void main(String[] args){
System.out.println("程序说明如下:");
System.out.println("由 m 个人围成一个首尾相连的圈报数。
从第一个人开始,从 1 开始报数,报到 n 的人出圈,剩下的人继续从 1 开始报数,
直到所有的人都出圈为止。对于给定的 m 和 n,求出所有人的出圈顺序.");
//提示输入总人数
System.out.println("请输入做这个游戏的总人数:");
Scanner sca=new Scanner(System.in);
int m=sca.nextInt();
//提示输入要出圈的数值
System.out.println("请输入要出圈的数值:
");
int n=sca.nextInt();
System.out.println("按出圈的次序输出序号:
");
//创建有 m 个值的数组
int[] a=new int[m];
//初始长度,以后出圈一个,长度就减一
int len=m;
//给数组赋值
for(int i=0;i<a.length;i++)
a[i]=i+1;
//i 为元素下表,j 代表当前要报的数
int i=0;
int j=1;
while(len>0){
if(a[i%m]>0){