线程-临界资源问题

线程-临界资源问题

同步代码块方法

用同步代码块解决临界资源问题

/**
* 同步代码块
* @param args
*/
public static void main( String[] args ){
    //实例化四个售票窗口
    Runnable world = new Runnable() {
        @Override
        public void run() {
            while (TicketCenter.restCount > 0){
                /**
                * synchronized ("") -->> 括号里面传入一个常量的,可以是字符串、int、对象、类等,就是不能是一个变量
                * 比如一个常量++,或者new object()对象,这样所就会发生改变了,
                * 也就是锁必须要每一个线程看到的锁是一样的
                */
                synchronized ("A"){
                if (TicketCenter.restCount<=0){
                return;
                }
                System.out.println(Thread.currentThread().getName()+"卖出一张票,剩余:"+ --TicketCenter.restCount +"张票");
            }
        }
    }
    };
    //四个线程售票
    Thread t1 = new Thread(world,"world - 1");
    Thread t2 = new Thread(world,"world - 2");
    Thread t3 = new Thread(world,"world - 3");
    Thread t4 = new Thread(world,"world - 4");
    //开启线程
    t1.start();
    t2.start();
    t3.start();
    t4.start();
}
public class TicketCenter {
    static int restCount = 100;
}

在这里插入图片描述


每一个线程在执行遇到synchronized (“A”) 要是没有拿到锁A的话就会进入锁池里面,争取cpu资源和锁,

然后执行。

同步方法

/**
 * 同步方法
 * @param args
 */
public static void main( String[] args ){
    //实例化四个售票窗口
    Runnable world = new Runnable() {
        @Override
        public void run() {
            while (TicketCenter.restCount > 0){
                soldTicket();
            }
        }
    };
    //四个线程售票
    Thread t1 = new Thread(world,"world - 1");
    Thread t2 = new Thread(world,"world - 2");
    Thread t3 = new Thread(world,"world - 3");
    Thread t4 = new Thread(world,"world - 4");
    //开启线程
    t1.start();
    t2.start();
    t3.start();
    t4.start();
}
public synchronized static void soldTicket(){
    if (TicketCenter.restCount<=0){
        return;
    }
    System.out.println(Thread.currentThread().getName()+"卖出一张票,剩余:"+ --TicketCenter.restCount +"张票");
}

在同步方法里面,方法是一个静态方法,则锁是当前类的class,方法是一个非静态方法里面,锁则是this

ReentrantLock锁

ReentrantLock是一个锁对象,可以实例化,

ReentrantLock.lock() 方法上锁,

ReentrantLock.unlock()释放锁。

/**
 *  使用ReentrantLock 上锁与解锁
 * @param args
 */
public static void main( String[] args ){
    //实例化锁对象
    final ReentrantLock lock = new ReentrantLock();
    //实例化四个售票窗口
    Runnable world = new Runnable() {
        @Override
        public void run() {
            while (TicketCenter.restCount > 0){
                lock.lock();
                if (TicketCenter.restCount<=0){
                    return;
                }
                System.out.println(Thread.currentThread().getName()+"卖出一张票,剩余:"+ --TicketCenter.restCount +"张票");
                lock.unlock();
            }
        }
    };
    //四个线程售票
    Thread t1 = new Thread(world,"world - 1");
    Thread t2 = new Thread(world,"world - 2");
    Thread t3 = new Thread(world,"world - 3");
    Thread t4 = new Thread(world,"world - 4");
    //开启线程
    t1.start();
    t2.start();
    t3.start();
    t4.start();
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值