首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程是如何工作的

线程是如何工作的
EN

Stack Overflow用户
提问于 2013-05-19 02:31:00
回答 2查看 142关注 0票数 3

我在理解线程的工作原理时遇到了一个问题:

代码语言:javascript
复制
class ThreadTest implements Runnable{ 
    synchronized void methodA(long n){ 
        for (int i=1;i<3;i++){System.out.print(n+" "+i)} 
    } 

    public void run(){ 
        methodA(Thread.currentThread.getId()); 
    } 

    public static void main(String ... args){ 
        new Thread(new ThreadTest()).start(); 
        new Thread(new ThreadTest()).start(); 
    } 
} 

据我目前所知,由于此方法中的methodA是一个同步的for循环,因此它必须在下一个线程调用此方法之前完成--因此结果必须类似于4-1 4-2 5-1 5-2...

有没有可能出现像4-1 5-1 5-2 4-2这样的结果?如果是,是如何实现的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-19 02:35:21

可以得到像4-1 5-1 5-2 4-2这样的结果吗?

这是可能的。

,如果是,如何实现?

您正在使用this引用作为被synchronized锁定的对象。因为您有两个不同的ThreadTest实例,所以每个方法都会锁定自己的实例,并且不会实现互斥。

因此,您必须理解synchronized的语义:总是有一个明确定义的对象涉及到它的监视器。基本上,该对象记录了哪个线程获得了它的监视器,并且只允许同一线程重新获得它;其他线程将被搁置,直到监视器被释放。当然,任何其他对象都与此无关,其监视器可由任何线程自由获取。

synchronized方法隐式地将this用于锁。对于您的示例,您可以做的是声明一个static final Object lock = new Object();并在您的方法中使用synchronized(lock)

票数 13
EN

Stack Overflow用户

发布于 2013-05-19 02:37:53

你可以得到结果4-1 5-1 5-2 4-2 .Also你可能会得到5-1 5-2 4-1 4-2,因为你不能保证哪个线程会启动只会把那个线程放入可运行的list.Thread调度程序会决定运行哪个线程

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

https://stackoverflow.com/questions/16627610

复制
相关文章

相似问题

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