关于java 中 线程加上synchronized关键字的执行顺序问题

发布于 2022-09-11 15:38:13 字数 2016 浏览 24 评论 0

第一种情况

package com.btmans.thread;

public class TestSync implements Runnable{
    int b = 100;
    public synchronized void m1() throws Exception{
        b = 1000;
        Thread.sleep(5000);
        System.out.println("b="+b);
        
    }
    public synchronized void m2() throws Exception{
        Thread.sleep(3000);
        b = 2000;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            m1();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        
        TestSync ts = new TestSync();
        Thread t = new Thread(ts);
        t.start();
        ts.m2();
        System.out.println("=="+ts.b);
        
    }
}

输出结果是:
==1000
b=1000

第二种情况:加上下面红色代码部分

package com.btmans.thread;

public class TestSync implements Runnable{
    int b = 100;
    public synchronized void m1() throws Exception{
        System.out.println("m1");"新增部分"
        b = 1000;
        Thread.sleep(5000);
        System.out.println("b="+b);
        
    }
    public synchronized void m2() throws Exception{
        System.out.println("m2");"新增部分"
        Thread.sleep(3000);
        b = 2000;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            m1();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws Exception {
        
        TestSync ts = new TestSync();
        Thread t = new Thread(ts);
        t.start();
        ts.m2();
        System.out.println("=="+ts.b);
        
    }
}

然后结果有时候是
m2
m1
==1000
b=1000
有时候又是
m2
m1
==2000
b=1000

这我就头大了,就只加了一个输出语句而已,为什么加过还会变化呢?加了"synchronized"后,代码的执行顺序到底是怎么样的呢?搞不明白了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

A君 2022-09-18 15:38:13

无非就是谁先抢到锁谁执行咯。。你第一种情况只有一种输出只是测试次数不够多罢了

我不是你的备胎 2022-09-18 15:38:13

main方法里的打印语句可没有同步,所以只能保证它在m2之后执行,至于它和m1中的语句顺序是没有什么保证的。

匿名的好友 2022-09-18 15:38:13

m1 m2 方法都加了 synchronized 关键字,t.start() 和 ts.m2() 这里用的是同一个对象 ts,这里两个线程,当一个线程获取锁执行的时候,另一个只能等待,而谁先获取锁,这是不确定的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文