首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCPJP考试中的多线程技术

OCPJP考试中的多线程技术
EN

Stack Overflow用户
提问于 2016-04-04 06:35:30
回答 4查看 224关注 0票数 5

虽然我找到了答案,但我遇到了一个我很难理解的问题。请看这个,给我一个关于答案的解释。

代码语言:javascript
复制
public class TestSeven extends Thread {
  private static int x;
  public synchronized void doThings() {
    int current = x;
    current++;
    x = current;
  }
  public void run() {
    doThings();
  }
} 

问题和答案是..。哪种说法是正确的?

A.汇编失败。

在运行时抛出异常。

同步run()方法将使类线程安全。

变量"x“中的数据不受并发访问问题的保护。

E. 将doThings()方法声明为静态将使类线程安全.

将语句包装在doThings()中的同步(新对象()){}块中将使类线程安全。

答案是大胆的。谢谢您的回复!

EN

回答 4

Stack Overflow用户

发布于 2016-04-04 06:41:35

如果有这样的同步实例方法,它就会在实例上同步,也就是说,每个实例都可以自己访问该方法。但是x是静态的,所以任何TestSeven实例都可以并发访问它。如果doThings()是静态的,它会在类上同步,因此只有一个实例可以在给定时间访问同步代码。

票数 6
EN

Stack Overflow用户

发布于 2016-04-04 06:43:02

下面是将要发生的事情。

代码语言:javascript
复制
public static syncronized void doThings();

这将在类级别同步方法。这意味着只有一个类实例能够在一个时间实例中访问代码,这意味着其他实例不可能修改静态变量x

在其他情况下,

代码语言:javascript
复制
public syncronized void doThings();

这意味着doThings();方法在当前对象上是同步的。即TestSeven的一个实例,因此多个实例可以访问该方法,而该方法又可以更改不需要的静态共享变量x

票数 1
EN

Stack Overflow用户

发布于 2016-04-04 06:43:32

使方法静态将使其在类级别上可用,而不是在实例级别上可用,因此方法行为对于该类的所有对象/实例都是相同的,就像一个静态变量一样。因此,类将变得线程安全,因为方法行为不是特定于实例的。

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

https://stackoverflow.com/questions/36395956

复制
相关文章

相似问题

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