package day02.leetcode;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class T1195 {
public static void main(String[] args) {
FizzBuzz fb = new FizzBuzz3(30);
new Thread(fb::fizz).start();
new Thread(fb::buzz).start();
new Thread(fb::fizzbuzz).start();
new Thread(fb::number).start();
}
static interface FizzBuzz {
public void fizz();
public void buzz();
public void fizzbuzz();
public void number();
}
// 事先计算好每个 i 该打印什么, 用 1,2,3,4 区分, 用乐观锁检查条件
static class FizzBuzz3 implements FizzBuzz {
private final int n;
private final int[] array;
private AtomicInteger i = new AtomicInteger();
public FizzBuzz3(int n) {
this.n = n;
this.array = new int[n];
for (int i = 1; i <= n; i++) {
if (i % 3 == 0 && i % 5 != 0) {
array[i - 1] = 1;
} else if (i % 3 != 0 && i % 5 == 0) {
array[i - 1] = 2;
} else if (i % 3 == 0) {
array[i - 1] = 3;
} else {
array[i - 1] = 4;
}
}
}
@Override
public void fizz() {
out:
while (i.get() < n) {
while (true) {
int i = this.i.get();
if (i >= n) {
break out;
}
if (array[i] == 1) {
break;
}
Thread.yield();
}
System.out.println("fizz");
i.incrementAndGet();
}
}
@Override
public void buzz() {
out:
while (i.get() < n) {
while (true) {
int i = this.i.get();
if (i >= n) {
break out;
}
if (array[i] == 2) {
break;
}
Thread.yield();
}
System.out.println("buzz");
i.incrementAndGet();
}
}
@Override
public void fizzbuzz() {
out:
while (i.get() < n) {
while (true) {
int i = this.i.get();
if (i >= n) {
break out;
}
if (array[i] == 3) {
break;
}
Thread.yield();
}
System.out.println("fizzbuzz");
i.incrementAndGet();
}
}
@Override
public void number() {
out:
while (i.get() < n) {
while (true) {
int i = this.i.get();
if (i >= n) {
break out;
}
if (array[i] == 4) {
break;
}
Thread.yield();
}
System.out.println(i.get() + 1);
i.incrementAndGet();
}
}
}
// 用多个条件变量精确控制唤醒, 性能较其他版本更佳
static class FizzBuzz2 implements FizzBuzz {
private final int n;
private int i = 1;
private final ReentrantLock lock = new ReentrantLock();
private final Condition c1 = lock.newCondition();
private final Condition c2 = lock.newCondition();
private final Condition c3 = lock.newCondition();
private final Condition c4 = lock.newCondition();
public FizzBuzz2(int n) {
this.n = n;
}
@Override
public void fizz() {
while (i <= n) {
lock.lock();
try {
if (i % 3 == 0 && i % 5 != 0) {
System.out.println("fizz");
i++;
if (i % 3 != 0 && i % 5 == 0) {
c2.signal();
} else if (i % 3 == 0 && i % 5 == 0) {
c3.signal();
} else {
c4.signal();
}
if (i == n) {
c2.signal();
c3.signal();
c4.signal();
}
} else {
try {
c1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
lock.unlock();
}
}
}
@Override
public void buzz() {
while (i <= n) {
lock.lock();
try {
if (i % 3 != 0 && i % 5 == 0) {
System.out.println("buzz");
i++;
if (i % 3 == 0 && i % 5 == 0) {
c3.signal();
} else if (i % 3 != 0 && i % 5 != 0) {
c4.signal();
} else {
c1.signal();
}
if (i == n) {
c1.signal();
c3.signal();
c4.signal();
}
} else {
try {
c2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
lock.unlock();
}
}
}
@Override
public void fizzbuzz() {
while (i <= n) {
lock.lock();
try {
if (i % 3 == 0 && i % 5 == 0) {
System.out.println("fizzbuzz");
i++;
if (i % 3 != 0 && i % 5 != 0) {
c4.signal();
} else if (i % 3 == 0 && i % 5 != 0) {
c1.signal();
} else {
c2.signal();
}
if (i == n) {
c1.signal();
c2.signal();
c4.signal();
}
} else {
try {
c3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
lock.unlock();
}
}
}
@Override
public void number() {
while (i <= n) {
lock.lock();
try {
if (i % 3 != 0 && i % 5 != 0) {
System.out.println(i);
i++;
if (i % 3 == 0 && i % 5 != 0) {
c1.signal();
} else if (i % 3 != 0 && i % 5 ==
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
面试专题--并发篇代码 (183个子文件)
RandomValue.class 32KB
BeanFactory.class 9KB
TestReentrantLock$MyReentrantLock.class 7KB
HashMapVsHashtable.class 7KB
HashMapDistribution.class 6KB
ArrayListVsLinkedList.class 5KB
TestOrder.class 5KB
LomutoVsHoare.class 5KB
TestThreadPoolExecutor.class 5KB
StableVsUnstable.class 5KB
TestReentrantLock.class 5KB
SyncVsCas.class 3KB
TestSingleton.class 3KB
DistributionAffectedByCapacity.class 3KB
T1226.class 3KB
T1195$FizzBuzz2.class 3KB
TestThreadState.class 3KB
StableVsUnstable$Card.class 3KB
WaitVsSleep.class 2KB
TestArrayList.class 2KB
ForeverLoop.class 2KB
DeepCopy2$Student.class 2KB
DeepCopy1$Student.class 2KB
T1117.class 2KB
QuickSortHoare.class 2KB
LoggerUtils.class 2KB
Singleton2.class 2KB
TestThreadLocal.class 2KB
AddAndSubtract.class 2KB
TestOomTooManyObject.class 2KB
T1226$DiningPhilosophers3.class 2KB
BubbleSort.class 2KB
T1195$FizzBuzz3.class 2KB
T1114$Foo5.class 2KB
T1195$FizzBuzz1.class 2KB
HashMapMissData.class 2KB
FailFastVsFailSafe.class 2KB
T1226$DiningPhilosophers1.class 2KB
TestOomThreadPool.class 2KB
TestThreadPoolExecutor$MyTask.class 2KB
T1117$H2OImpl3.class 2KB
HeapSort.class 2KB
QuickSort3.class 2KB
QuickSort2.class 2KB
ShallowCopy$Student.class 2KB
QuickSort1.class 2KB
TestOomMutableObject$Student.class 2KB
T1116$ZeroEvenOdd1.class 2KB
T1195.class 2KB
T1114.class 2KB
T1226$DiningPhilosophers2.class 2KB
Utils.class 2KB
TestOomMutableObject.class 2KB
T1114$Foo3.class 1KB
T1116.class 1KB
HashMapMutableKey$Student.class 1KB
EnumCreator.class 1KB
ShellSort.class 1KB
Reordering$Case1.class 1KB
BeanFactory$MethodInvoke.class 1KB
Reordering$Case3.class 1KB
ShallowCopy.class 1KB
Reordering$Case2.class 1KB
T1115.class 1KB
DeepCopy1.class 1KB
DeepCopy2.class 1KB
InsertSort.class 1KB
StableVsUnstable$Sharp.class 1KB
T1114$Foo2.class 1KB
T1115$FooBar1.class 1KB
TestOomTooManyClass.class 1KB
TestThreadLocal$Utils.class 1KB
T1117$H2OImpl2.class 1KB
T1114$Foo4.class 1KB
T1117$H2OImpl1.class 1KB
TestOomTooManyObject$Product.class 1KB
BeanFactory$BeanDefinition.class 1KB
HashMapMutableKey.class 1KB
FailFastVsFailSafe$Student.class 1KB
T1115$FooBar2.class 1018B
MyService.class 1012B
SelectionSort.class 998B
Singleton1.class 982B
BinarySearch.class 975B
Sex.class 968B
StableVsUnstable$1.class 937B
T1114$Foo1.class 900B
IntegerOverflow.class 881B
Singleton4.class 878B
Singleton3.class 792B
Singleton5.class 777B
TestReentrantLock$MyThread.class 635B
Singleton5$Holder.class 509B
Reordering.class 505B
MyDao.class 499B
BeanFactory$InstanceProcessor.class 459B
BeanFactory$InitializeProcessor.class 444B
BeanFactory$InjectProcessor.class 413B
Inject.class 412B
T1226$DiningPhilosophers.class 409B
共 183 条
- 1
- 2
无私的Z
- 粉丝: 12
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0