面试:生产者消费者
(生产者消费者,思索,单例,八大排序)
传统版 sychronized wait notify
public class test {
public static void main(String[] args) {
A a =new A();
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
a.incr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"Thread1+").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
a.decr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"thread-").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
a.incr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"Thread2+").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
a.decr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"thread2-").start();
}
}
class A{
int num = 0 ;
public synchronized void incr() throws InterruptedException {
while(num!=0){
this.wait();
}
this.num++;
System.out.println(Thread.currentThread().getName()+"执行完了+ 操作===》现在num值为:"+num);
this.notify();
}
public synchronized void decr() throws InterruptedException {
while(num==0){
this.wait();
}
this.num--;
System.out.println(Thread.currentThread().getName()+"执行完了- 操作===》现在num值为:"+num);
this.notify();
}
}
结果:
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
public class test {
public static void main(String[] args) {
A a =new A();
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
a.incr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"Thread1+").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
a.decr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"thread-").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
a.incr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"Thread2+").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
a.decr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"thread2-").start();
}
}
class A{
int num = 0 ;
public synchronized void incr() throws InterruptedException {
if(num!=0){
this.wait();
}
this.num++;
System.out.println(Thread.currentThread().getName()+"执行完了+ 操作===》现在num值为:"+num);
this.notify();
}
public synchronized void decr() throws InterruptedException {
if(num==0){
this.wait();
}
this.num--;
System.out.println(Thread.currentThread().getName()+"执行完了- 操作===》现在num值为:"+num);
this.notify();
}
}
结果:
Thread1+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread-执行完了- 操作===》现在num值为:0
thread2-执行完了- 操作===》现在num值为:-1
thread2-执行完了- 操作===》现在num值为:-2
thread2-执行完了- 操作===》现在num值为:-3
thread2-执行完了- 操作===》现在num值为:-4
Thread1+执行完了+ 操作===》现在num值为:-3
新版 lock await signal
class A{
int num = 0 ;
Lock lock=new ReentrantLock();
Condition condition = lock.newCondition();
public void incr() throws InterruptedException {
lock.lock();//上锁
try {//业务代码
while(num!=0){
condition.await();
}
this.num++;
System.out.println(Thread.currentThread().getName()+"执行完了+ 操作===》现在num值为:"+num);
condition.signal();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void decr() throws InterruptedException {
lock.lock();
try {
while(num==0){
condition.await();
}
this.num--;
System.out.println(Thread.currentThread().getName()+"执行完了- 操作===》现在num值为:"+num);
condition.signal();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
Thread1+执行完了+ 操作===》现在num值为:1
thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Thread1+执行完了+ 操作===》现在num值为:1
thread1-执行完了- 操作===》现在num值为:0
Thread2+执行完了+ 操作===》现在num值为:1
thread2-执行完了- 操作===》现在num值为:0
Condition可以实现精准的唤醒
例如循环的 唤醒 等等
class A{
int num = 0 ;
Lock lock=new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
public void incr() throws InterruptedException {
lock.lock();//上锁
try {//业务代码
while(num!=0){
condition1.await();
}
this.num++;
System.out.println(Thread.currentThread().getName()+"执行完了+ 操作===》现在num值为:"+num);
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void decr() throws InterruptedException {
lock.lock();
try {
while(num==0){
condition2.await();
}
this.num--;
System.out.println(Thread.currentThread().getName()+"执行完了- 操作===》现在num值为:"+num);
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}