首页 > 编程语言 > 详细

Java中的synchronized和lock

时间:2019-08-03 19:42:56      阅读:71      评论:0      收藏:0      [点我收藏+]

synchronized 是 Java 中的关键字,它的作用是一把锁,也就是在 Java 的多线程中会有很多并发的现象,多个线程访问同一段逻辑代码。这个时候就需要给这段代码加上一个锁来确保代码的的原子性,也就是保证代码运行出来的效果和自己想的一致。

synchronized 的使用方式有:

1、以代码块的方式,并且将一个对象作为锁,也就是只有拿到这个对象才能执行同步代码块中的逻辑操作。

synchronized (一个对象) { ...... }

2、可以在一个方法上加上锁

public void synchronized m1 () { ...... }

下面给一段代码参考

public class SyncBlockDemo {
    public static void main(String[] args) {
        Web12306 web12306 = new Web12306();
        new Thread(web12306, "票贩一").start();
        new Thread(web12306, "票贩二").start();
        new Thread(web12306, "票贩三").start();
        new Thread(web12306, "票贩四").start();
        new Thread(web12306, "票贩五").start();
    }
}

class Web12306 implements Runnable {

    private Integer tickets = 10;
    private Boolean flag = true;

    @Override
    public void run() {
        while (flag) {
            execute();
        }
    }

    void execute() {
        // 此处多加一个if判断是做了代码的优化,当一个线程购买了最后一张票后,这个时候其他的线程在进入此方法时判断tickets,
        // 票卖完后就直接停掉当前进入的线程,此时这些线程就不会在再synchronized所前等待执行下边代码了。但是这个判断只是对
        // 代码的优化。因为有一种情况是在剩最后一张票的时候若是有两个或者以上的线程都满足这个if判断后就会造成这几个线程都
        // 执行到获取缩的这一步,而且此时他们获取的tickets都是1,所以在synchronized代码块中就需要再做一次判断,防止数据
        // 不一致,这里的两个if判断又称为double check
        if (tickets <= 0) {
            flag = false;
            return;
        }
        synchronized (this) {
            if (tickets <= 0) {
                flag = false;
                return;
            }
            System.out.println(Thread.currentThread().getName() + " 购票:" + tickets--);
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 

Java中的synchronized和lock

原文:https://www.cnblogs.com/alu-bigdata/p/11295824.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!