美文网首页JAVA技术文章
java并发之Lock对象的await和signal

java并发之Lock对象的await和signal

作者: rejoice001 | 来源:发表于2018-06-27 23:31 被阅读6次

2个窗口交替出售一张票,控制台可能会因为异步打印的原因出现连续打印一个窗口的票,但是票的奇偶肯定固定在一个窗口出售

package com.rejoice.concurrency;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class AwaitAndSignal {
    
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Seller1(ticket).start();
        new Seller2(ticket).start();
    }
    static class Ticket{
        public Integer count = 1000;
        public Boolean isSeller1 = true;
        public ReentrantLock lock = new ReentrantLock();
        public Condition condition = lock.newCondition();
    }
    
    static class Seller2 extends Thread{
        
        private Ticket ticket;
        
        Seller2(Ticket ticket){
            this.ticket = ticket;
        }
        
        @Override
        public void run() {
                while(ticket.count > 0) {
                    try {
                        ticket.lock.lock();
                        if(ticket.isSeller1) {
                            try {
                                ticket.condition.await();
                            } catch (InterruptedException e) {
                            }
                        }
                        if(ticket.count <= 0) {
                            continue;
                        }
                        System.err.println("窗口2售第【 "+ticket.count+" 】张票");
                        ticket.count--;
                        ticket.isSeller1=true;
                        ticket.condition.signal();
                    } finally {
                        ticket.lock.unlock();
                    }
                    
                }
        }
        
    }
    
    static class Seller1 extends Thread{
        
        private Ticket ticket;
        
        Seller1(Ticket ticket){
            this.ticket = ticket;
        }
        
        @Override
        public void run() {
                while(ticket.count > 0) {
                    try {
                        ticket.lock.lock();
                        if(!ticket.isSeller1) {
                            try {
                                ticket.condition.await();
                            } catch (InterruptedException e) {
                            }
                        }
                        if(ticket.count <= 0) {
                            continue;
                        }
                        System.out.println("窗口1售第【 "+ticket.count+" 】张票");
                        ticket.count--;
                        ticket.isSeller1=false;
                        ticket.condition.signal();
                    } finally {
                        ticket.lock.unlock();
                    }
                }
        }
        
    }
}

运行结果

image.png

Lock对象和synchronize关键字的区别

Lock对象可以灵活控制上锁和释放锁,synchronize是有jdk底层控制

相关文章

网友评论

    本文标题:java并发之Lock对象的await和signal

    本文链接:https://www.haomeiwen.com/subject/gcdwyftx.html