【问题标题】:java synchronised positives/negatives and usagejava同步的正面/负面和用法
【发布时间】:2018-05-24 01:20:46
【问题描述】:

我已经阅读了所有关于同步方法如何运作的理论,但我需要一个实际的例子。

什么是正反或这样使用同步:

public class Test {
    public static void main(String[] args){
        boolean sync = Boolean.valueOf(args[0]);
        Person person1 = person2 = new Person();

        person1.write(sync, args[1]);
        person1.read(sync);
        person2.write(sync, args[1]);
        person2.read(sync);

    }
}

write 为项目命名:(同步与否)

public static String project_name = "";

并且 read 正在打印此人的当前姓名(同步或不同步)

那么当 write 和 read 是常规方法和同步方法时有什么区别呢?

如果我使用常规方法会出现什么问题?

【问题讨论】:

  • 对于初学者,您需要有多个线程才能看到任何区别。
  • 你的意思是如果你有 100 个Person 变量?不会有什么不同。
  • 怎么样?这是一个服务器应用程序吗?请提供更多上下文。
  • 如果有多个线程访问同一个字段,你可能需要同步。
  • 一百万件事情。你的问题太笼统了。

标签: java synchronized


【解决方案1】:

快速回答: 被多个来源访问的非同步方法通常会导致未定义的行为,但同步方法每次都会起作用。

更长的答案: 我认为您没有完全理解同步方法是什么,因为您的代码根本没有演示它。

如果确实有可能有 100 个人访问同一个方法,那么当写入和读取同一个变量时,您将有未定义的行为。

但是,如果同步访问该方法,则每个方法调用都将添加到队列中并按顺序发生。

例如: 100 个不同的线程(人?)可以在下面的代码上调用SynchronizedProjectName.renameProject("exampleName"); 和/或SynchronizedProjectName.projectName();,不会发生错误,也不会同时发生读/写。

public class SynchronizedProjectName {
    private string project_name = "";

    public synchronized void renameProject(String newProjectName) {
        project_name = newProjectName;
    }

    public synchronized string projectName() {
        return project_name;
    } 
}

在处理多个线程/用户时,您应该始终使用某种线程安全策略,如果您不这样做,那么您应该期望您的代码行为不端并可能崩溃。

更多信息请看这里:https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

【讨论】:

  • 注:阅读Oracle提供的整个同步教程需要付费:docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
  • 假设只有一个类的实例将用于调用 synchroniezd 方法(OP 变量为static)。 synchronized 方法就像 synchronized(this) 块。
  • @AxelH 正确。这似乎是 OP 想要的(来自上面的 cmets)。
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 2010-10-26
  • 1970-01-01
  • 2017-11-29
  • 2014-02-16
  • 1970-01-01
  • 2023-04-05
  • 2013-10-21
相关资源
最近更新 更多