2021-04-19

线程的同步方式有三种:
1.同步代码块
2.同步方法
3.lock方式

1.同步代码块:
格式如下:

synchronized (同步监视器){
                //需要被同步的代码
}

说明:

操作共享数据的代码,即为需要被同步的代码

同步监视器:任何一个类的对象都可以充当锁
要求:多个线程必须同用一把锁
①在实现runnable接口创建多线程时方式中,可以考虑使用this充当同步监视器
②在继承Thread类创建多线程方式中慎用this充当同步监视器
可以考虑使用当前类充当同步监视器

2.同步方法:
原理:
将要执行的代码的方法写为:public synchronized void xxx(){}
格式

说明:
①要是继承Thread类创建多线程方式中,应考虑将同步方法声明为静态的
②同步方法仍涉及到同步监视器,只是不显示的声明
③非静态的同步方法中涉及到的同步监视器为this
静态的同步方法中涉及到的同步监视器是当前类的本身

  • 3.Lock(锁):
    从JDK5.0开始,Java提供了强大的线程同步机制-通过显示定义同步锁对象来实现同步.同步锁使用Lock对象充当.

举例:

private int ticket = 100;
    private ReentrantLock lock1 = new ReentrantLock(true);

    @Override
    public void run() {
        while (true) {
            try {
                //调用lock方法
                lock1.lock();
                if (ticket > 0 ){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":票号为:"+ticket);
                    ticket--;
                }else break;
            }finally {
            //调用解锁的方法
                lock1.unlock();
            }
        }
    }

说明:
①ReentrantLock()可以定义空参的,也可以在参数内填入true

填入true后线程将按先后顺序依次进行

②Lock需手动的启动同步(lock()),同时结束同步也需要手动的实现(unLock())
③使用Lock,JVM将花费较少的时间来调度线程,性能更好.
并且具有更高的扩展性(提供更多子类)

开发中建议优先选用Lock同步方法,不仅效率高可扩展性好,还能很好的避免了死锁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值