Thread-Safe在java中的含义是什么?我们什么时候称为Thread-Safe?

时间:2011-09-04 20:29:01

标签: java

我不是以任何方式理解这个概念。

public class SomeName {

     public static void main(String args[]) {

     }

}

这是我的班级SomeName。现在这里的主题是什么。

  1. 我们是否将该类称为线程。
  2. 当其他对象试图访问其方法或成员时,我们是否将此类称为线程?
  3. 当其他对象试图访问此对象时,我们是否将此类称为线程?
  4. 当我们在java中调用某些东西作为线程安全的时候意味着什么?

6 个答案:

答案 0 :(得分:9)

线程安全意味着避免几个问题。最常见也可能是最差的称为threadlock。旧的比喻是用餐哲学家的故事。他们非常有礼貌,当其他人也这样做时,他们永远不会拿出筷子来取食。如果他们都在同一时间伸出手,那么他们都会在同一时间停下来,等待......没有任何事情发生,因为他们太礼貌了,不能先走。

正如其他人指出的那样,如果你的应用程序从不创建额外的线程,而只是从主方法运行,那么只有一个线程或一个“餐饮哲学家”,因此不能发生线程锁。当你有多个线程时,避免线程锁定的最简单方法是使用“监视器”,它只是一个被搁置的对象。实际上,您的方法必须在访问线程之前在此监视器上获取“锁定”,因此不会发生冲突。但是,您仍然可以使用threadlock,因为可能有两个对象尝试访问两个不同的线程,每个线程都有自己的监视器。对象A必须等待对象B释放其对监视器对象1的锁定;对象B必须等待对象A释放其对监视器对象2的锁定。所以现在你回到了线程锁。

简而言之,线程安全并不十分难以理解,但确实需要时间,实践和经验。第一次编写多线程应用程序时,运行到threadlock中。然后你将学习,很快就会变得非常直观。最大的警告是,您需要尽可能简化应用程序的多线程部分。如果你有很多线程,有很多监视器和锁,那么确保你的餐饮哲学家永远不会冻结会变得更加困难。

Java教程非常好地介绍了线程;它是我所需要的唯一资源。

答案 1 :(得分:4)

您可能希望将线程视为执行您编写的代码的CPU。

What is thread?

  

线程是程序中单个顺序控制流。

来自Java concurrency in practice

  

线程安全类封装了任何所需的同步,以便   客户不需要提供自己的。

答案 2 :(得分:3)

在任何时候,您都有“执行点”,JVM正在运行您的代码,逐步执行方法并执行程序要求它执行的操作。

对于简单的程序,你只有一个。对于更复杂的程序,您可以使用多个程序,通常使用新的Thread()。run或Executor调用。

“线程安全”是指您的代码编写方式使得一个执行点无法更改另一个执行点所看到的内容。这通常是非常理想的,因为这些更改可能很难调试,但由于您只有一个,因此没有其他更改,因此不适用。

线程是一个高级主题,您将在稍后回来,但现在只要认为如果您不对Threads或Swing做任何特殊操作,这将不适用于您。它会在以后,但不是现在。

答案 3 :(得分:1)

嗯,在您的具体示例中,当您的程序运行时,它只有1个线程 主线。

答案 4 :(得分:1)

当一个类的对象可以从多个线程(因此来自多个CPU)并行访问时,类是线程安全的,而没有任何保证它将以单线程方式提供它。

您应首先阅读有关线程的确切内容,例如on Wikipedia,这样可以更容易理解类和线程之间的关系以及线程安全的概念。

答案 5 :(得分:1)

Java中的每一段代码都在某个线程上执行。默认情况下,有一个“主”线程调用您的main方法。程序中的所有代码都在主线程上执行,除非您创建另一个线程并启动它。当您明确调用Thread.start()方法时,线程会启动;当您调用间接调用Thread.start()的API时,它们也可以隐式启动。 (通常会记录启动线程的API调用。)调用Thread.start()时,它会创建一个新的执行线程并调用Thread对象的run()方法。线程在其run()方法返回时退出。

还有其他影响线程的方法,但这是基础知识。您可以在Java concurrency tutorial

中阅读更多详细信息