首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java线程-同步(此)

Java线程-同步(此)
EN

Stack Overflow用户
提问于 2012-04-26 06:16:47
回答 2查看 530关注 0票数 2

请看下面的节目

代码语言:javascript
复制
public class TestVolatile implements Runnable {

    public static volatile int counter;
    public static String lock = "lock";

    public static void main(String[] args) {
        Thread t1 = new Thread(new TestVolatile(),"Thread-1");
        Thread t2 = new Thread(new TestVolatile(),"Thread-2");
        t1.start();
        t2.start();
    }

    public void run() {
        synchronized(this) {
            System.out.println(Thread.currentThread()+"-"+counter);
            counter++;
        }
    }
}

如果我多次运行这个程序,我会得到3个不同的结果。

第一是

线程-1,5,main-0

线程-2,5,主-0

二是

线程-1,5,main-0

线程-2,5,main-1

三是

线程-1,5,main-1

线程-2,5,主-0

但是,如果将锁对象从"this“更改为" lock ",则会得到两个不同的结果

第一是

线程-1,5,main-0

线程-2,5,主-1

二是

线程-1,5,main-1

线程-2,5,主-0

在编写程序时,我的假设是,无论在哪种情况下,“计数器”都不应该在两个语句中都为0。

有人能解释一下吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-26 06:23:40

创建两个TestVolatile对象。"this“关键字指在线程中运行的TestVolatile对象。因此,在第一个示例中,您不会对同一个对象进行同步。

如果您像这样更改代码,那么第一个示例就开始工作了:

代码语言:javascript
复制
public static void main(String[] args) {
    TestVolatile testVolatile = new TestVolatile();
    Thread t1 = new Thread(testVolatile,"Thread-1");
    Thread t2 = new Thread(testVolatile,"Thread-2");
    t1.start();
    t2.start();
}
票数 3
EN

Stack Overflow用户

发布于 2012-04-26 06:35:19

这可能不是您要寻找的东西,但是如果您想避免使用synchronizedvolatile,您应该使用AtomicIntegerhttp://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html的实例

使用getAndIncrement方法显示与示例中相同的行为。

代码语言:javascript
复制
public class TestVolatile implements Runnable {

    public static AtomicInteger counter = new AtomicInteger();
    public static void main(String[] args) {
        Thread t1 = new Thread(new TestVolatile(),"Thread-1");
        Thread t2 = new Thread(new TestVolatile(),"Thread-2");
        t1.start();
        t2.start();
    }

    public void run() {
        System.out.println(Thread.currentThread() + " - " + counter.getAndIncrement());
    }

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

https://stackoverflow.com/questions/10328154

复制
相关文章

相似问题

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