首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法,但是代码由于非序列化线程行为而产生随机结果。

方法,但是代码由于非序列化线程行为而产生随机结果。
EN

Stack Overflow用户
提问于 2018-08-07 17:50:01
回答 3查看 73关注 0票数 2

这是我的代码:

代码语言:javascript
运行
复制
public class ThreadDemo {

public static void main(String args[]) throws Exception {
    Printer[] printers = new Printer[5];
    printers[0] = new Printer("@base");
    printers[1] = new Printer("#try");
    printers[2] = new Printer("!test");
    printers[3] = new Printer("^hello");
    printers[4] = new Printer("*world");

    for (Printer x : printers) {
        x.start();
    }

    try {
        for (Printer y : printers) {
            y.join();
        }
    } catch (InterruptedException e) {
        System.out.println(e);
    }
  }
}

class Printer extends Thread {
public Printer(String name) {
    super(name);
}

public void run() {
    print();
}

public synchronized void print() {
    for (int i = 0; i < 10; i++) {
        System.out.print(getName().charAt(0));
        try {
            sleep(100);
        } catch (InterruptedException e) {
            System.out.println(e + " occured");
        }
    }
  }
}

其结果是

代码语言:javascript
运行
复制
@^!#**@^!#*#@!^@*#^!#^!*@^*@!#@!#*^@#^!*!@^#*#@*^! 

我的期望是,所有符号都将被序列化为@^,而线程则是根据它首先启动的。

调用睡眠()将允许其他线程继续到当前线程的休眠时间,但是我想同步方法不应该是这样的。

EN

Stack Overflow用户

发布于 2019-02-05 15:08:34

@SolomonSlow -那么它必须被更正为“没有同步方法”可以同时在同一个对象上调用?

关于同步实例方法,您只需要了解一件事。你得知道这个..。

代码语言:javascript
运行
复制
synchronized void Foobar() { ... }

...Is只是编写同步块的一种快捷方式。

代码语言:javascript
运行
复制
void Foobar() {
    synchronized (this) {
        ...
    }
}

这两个方法声明所做的事情完全相同。因此,您所知道或了解的有关同步块行为的所有知识也可以应用于同步方法。

关于synchronized块,最重要的是:“任何两个线程都不能同时在同一个对象上同步。”如果您理解这一点,并且知道同步方法如何只是同步块的快捷方式,那么您可以回答自己的问题。

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

https://stackoverflow.com/questions/51732671

复制
相关文章

相似问题

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