繁体   English   中英

线程同步相关问题

[英]Thread Synchronization related issue

我最近开始学习Java多线程。 我正在尝试各种同步方案。 这是我的代码

 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());
            }

        }
    }
}

这是输出

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

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

PS:此输出不是我得到的唯一输出。 有时我得到的输出与上述理论一致。 像这个

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

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

  Synchronized_test st=new Synchronized_test();
    Thread t=new Thread(new Synchronized_test());
    t.start();

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

您仅运行一个线程“ t”。 请注意,st是已实现Runnable接口的Synchronized_class实例。 您将必须启动一个新线程“ t0”。 尝试以下代码:

Thread t0 = new Thread(new Synchronized_test());
Thread t = new Thread(new Synchronized_test());
t0.start();
t.start();

此外,您的代码尚不清楚,无法理解“同步语句”的概念。 我建议您从链接http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html尝试一个简单的同步语句示例。 它可以清除您的理解并帮助您更好地构建代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM