首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与线程同步相关的问题

与线程同步相关的问题
EN

Stack Overflow用户
提问于 2014-03-23 21:24:29
回答 2查看 63关注 0票数 1

我最近开始学习java中的多线程。我尝试了同步的各种场景。这是我的代码

代码语言:javascript
复制
 package main_classes;
public class Synchronized_test implements Runnable {
    public Object lock2=new Object();
    private static int shared_var;
    public Synchronized_test()
    {
        shared_var=0;
    }

    int getsharedvarvalue()
    {
        return shared_var;
    }

    void setsharedvarvalue(int i)
    {
        shared_var=i;
    }

    public void run() 
    {
        synchronized(lock2)
        {
            System.out.println("Child Thread: Waiting");
            for(int i=0;i<5;i++)
            {
                //this.setsharedvarvalue(i);
                System.out.println("Child Thread: Shared Variable = " + shared_var);
            }
        }
    }

    //@SuppressWarnings("unused")
    public static void main(String args[]) throws InterruptedException
    {
        Synchronized_test st=new Synchronized_test();
        Thread t=new Thread(new Synchronized_test());
        t.start();
        synchronized(st.lock2)
        {
            for(int i=0;i<5;i++)
            {
                st.setsharedvarvalue(i);
                System.out.println("Main Thread: Shared Variable = " +st.getsharedvarvalue());
            }

        }
    }
}

这是输出

代码语言:javascript
复制
Child Thread: Waiting
Main Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Main Thread: Shared Variable = 1
Child Thread: Shared Variable = 1
Main Thread: Shared Variable = 2
Child Thread: Shared Variable = 2
Main Thread: Shared Variable = 3
Child Thread: Shared Variable = 3
Main Thread: Shared Variable = 4
Child Thread: Shared Variable = 4

根据我从在线阅读中了解到的,如果锁被其他线程获取,则线程必须等待。因此,根据代码,无论哪个线程先获得lock,都将打印出所有值,然后第二个线程执行。但从输出中可以看出,两个线程似乎都在它们的同步块中,并且同时运行。请解释一下这种行为。

PS:这个输出并不是我得到的唯一输出。有时,我得到的输出与上面提到的理论一致。就像这个

代码语言:javascript
复制
Child Thread: Waiting
Child Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Main Thread: Shared Variable = 0
Main Thread: Shared Variable = 1
Main Thread: Shared Variable = 2
Main Thread: Shared Variable = 3
Main Thread: Shared Variable = 4
EN

Stack Overflow用户

发布于 2014-03-23 21:33:25

你只运行了一个线程对象,不是吗?

代码语言:javascript
复制
  Synchronized_test st=new Synchronized_test();
    Thread t=new Thread(new Synchronized_test());
    t.start();

只启动线程t,而根本不运行st

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22591489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档