120-同步代码块以及同步方法之间的区别和关系

synchronized关键字同步方法的使用

代码:

// 单线程运行synchronized方法里边的内容
@Override
public synchronized void run() {
    while (true) {
        // 1
        if (index > MAX) {
            break;
        }
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
        // 2
    }
}

运行结果:只有线程t1运行并输出信息。

分析:三个线程同时去争抢synchronized的方法锁,此时线程t1争抢到锁然后进入同步方法运行程序,一直到运行完成;然后线程t2争抢到锁并进入同步方法,但是此时index > MAX只能跳出程序。线程t3亦是如此。

注:同步代码块的锁为LOCK锁;同步方法的锁为this锁

此时,应该如何使用synchronized同步方法来实现同步运行呢?

@Override
public void run() {
    while (true) {
        if (ticket()) {
            break;
        }
    }
}

private synchronized boolean ticket() {
    // 1. getField
    if (index > MAX) {
        return true;
    }
    Thread.sleep(5);
        // index++; => index = index + 1;
    // 1. get Field index.
    // 2. index = index + 1;
    // 3. put Field index.
    System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
    return false;
}

private boolean ticket2() {
    synchronized (this) {
        if (index > MAX) {
            return true;
        }
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
        return false;
    }
}

使用同步代码块的原则:使用synchronized关键字应尽量小地给共享数据加锁


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com

文章标题:120-同步代码块以及同步方法之间的区别和关系

文章字数:318

本文作者:神秘的小岛岛

发布时间:2019-11-24, 17:59:20

最后更新:2019-11-24, 18:39:11

原始链接:https://www.tuyrk.cn/wang-thread/120-sync-codeblock-method/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏