首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程实例新旧java

线程实例新旧java
EN

Stack Overflow用户
提问于 2013-03-04 14:22:43
回答 2查看 165关注 0票数 3

我在学习java线程(同步和锁),但不知何故,我找不到这两个东西之间的区别。

代码语言:javascript
复制
// Two different instances of SyncExample
Thread a1 = new Thread(new SyncExample(), "A");
Thread b1 = new Thread(new SyncExample(), "B");

// Same instance is passed to both the threads
SyncExample syn = new SyncExample();
Thread a2 = new Thread(syn, "A");
Thread b2 = new Thread(syn, "B");

// I believe in total 4 stacks are built.
a1.start();
b1.start();

a2.start();
b2.start();

public class SyncExample implements Runnable {

    Object obj = new Object();

    @Override
    public void run() {

        this.myName();
    }

    private void myName() {

        synchronized (obj) {
            System.out.print("Define" + Thread.currentThread().getName());
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
                System.out.println(ex);
            }
            System.out.print("tly" + Thread.currentThread().getName());
        }
        System.out.println(" Maybe" + Thread.currentThread().getName());
    }
}


public class SyncExample implements Runnable {

    Object obj = new Object();

    @Override
    public void run() {

        this.myName();
    }

    private void myName() {

        synchronized (obj) {
            System.out.print("Define" + Thread.currentThread().getName());
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
                System.out.println(ex);
            }
            System.out.print("tly" + Thread.currentThread().getName());
        }
        System.out.println(" Maybe" + Thread.currentThread().getName());
    }
}

但这里的问题是,当我使用

1-相同的参考输出为:

代码语言:javascript
复制
DefineAtlyA MaybeA
DefineBtlyB MaybeB

2-2个不同的实例:

代码语言:javascript
复制
DefineADefineBtlyAtlyB MaybeB
 MaybeA

你能给我解释一下当我们把runnable目标传递给Thread类时有什么区别吗? 1.相同的实例2.不同的实例

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-04 15:36:43

在您的代码中,当您传递两个不同的实例( SyncExample类)时,每个实例都有自己的锁对象(由变量obj持有)。因为有两个不同的锁对象,所以每个线程获得一个锁并并行执行,导致线程A和B的交错输出(DefineADefineBtlyAtlyB MaybeB MaybeA)。

而当您传递相同的实例时,只有一个SyncExample类的实例。因此,只有一个锁对象的实例(由变量obj保存)。因此,这个锁对象将在两个线程之间共享。由于这种共享,只有一个线程(比如T1)能够进入synchronized块;另一个线程(比如T2)将一直等到T1存在synchronized块。因此,在执行过程中,首先会看到线程A的所有打印语句,然后是线程B的所有语句(DefineAtlyA MaybeA DefineBtlyB MaybeB)。

如果我概括一下这一点:当您传递不同的实例时,只有静态变量会影响线程的并行执行,但是当您传递单个实例时,静态变量和类级别变量(如代码中的obj变量)都会影响线程的并行执行。

票数 2
EN

Stack Overflow用户

发布于 2013-03-04 14:27:22

输出应该会提示您不同之处。

当您将相同的锁传递给两个不同的线程时,其中只有一个线程能够获取obj上的锁并执行synchronized块中的代码。

当您传入两个不同的SyncExample对象时,这两个线程都能够同时执行,因为它们在不同的对象上同步。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15195735

复制
相关文章

相似问题

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