java加锁方式

java加锁方式

1、synchronized方式(重量级锁)

加锁方式:synchronized(object)传入对象,不同对象代表不同锁,可以在线程外部新建对象。

public class SellCinemaTicketThread implements Runnable {
    static int num = 100;
    Object object = new Object();

    @Override
    public void run() {
        while (true) {
            synchronized (object) {
                if (num > 0) {
                    System.out.println(Thread.currentThread().getName() + "买票啦---" + num);
                    num--;
                }
            }

        }
    }
}

也可以作为方法的修饰传入

public class SellCinemaTicketThread1 implements Runnable {
    static int num = 100;

    @Override
    public void run() {
        sell();
    }

    private synchronized void sell() {
        while (true) {
            if (num > 0) {
                System.out.println(Thread.currentThread().getName() + "买票啦---" + num);
                num--;
            }
        }
    }
}

2、Lock(比synchronized要轻量级)

  • 新建锁对象Lock l = new ReentrantLock();
  • 加锁 l.lock()
  • 解锁 l.unlock()
public class TestLockSellTicket implements Runnable {
    static int num = 100;
    Lock l = new ReentrantLock();

    @Override
    public void run() {
        while (true) {
            l.lock();
            if (num > 0) {
                try {
                    Thread.sleep(100);
                    System.out.println("买票啦---" + num);
                    num--;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    l.unlock();
                }

            }

        }

    }
}

3、wait() notify() notifyAll()

/*
wait() notify() notifyAll() 是Object上的方法,只有Object是对象监视器时候才能调用此方法
    notify() 唤醒同一个对象监视器上的线程

    wait(Long timeout) 传入数值,表示超过某个时间还没有被唤醒则自动唤醒

    wait和sleep区别:
        sleep() 可以在同步中和同步外使用,线程遇到sleep不释放锁,时间到了继续向下执行
        wait() 只能在同步中使用,由对象监视器调用, 线程进入wait状态时释放掉锁

*/
public class TestWaitAndNotify {
    public static void main(String[] args) {
        Object obj = new Object();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (obj) {
                    System.out.println("开始等待。。。。");
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("等待结束。。。。");
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (obj) {
                    // 休眠两秒再唤醒线程
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    obj.notify();
                }
            }
        }).start();
    }
}

买票加锁

SellCinemaTicketThread1类


public class SellCinemaTicketThread1 implements Runnable {
    static int num = 100;

    @Override
    public void run() {
        sell();
    }

    private synchronized void sell() {
        while (true) {
            if (num > 0) {
                System.out.println(Thread.currentThread().getName() + "买票啦---" + num);
                num--;
            }
        }
    }
}

TestSellCinemaTicket 买票类 多个线程同时卖票

/*

保持同步:
    代码块加锁  synchronized (任意对象即对象锁) {需要同步的对象}
    方法加锁 在方法返回值前加synchronized
        private synchronized void sell() {同步代码}
*/

public class TestSellCinemaTicket {
    public static void main(String[] args) {
//        Runnable r = new SellCinemaTicketThread();
        Runnable r = new SellCinemaTicketThread1();

        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        Thread t3 = new Thread(r);

        t1.start();
        t2.start();
        t3.start();

    }
}

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值