2009-08-12 88 views
3

​​陈述的用法是什么?什么是同步语句用于?

+0

你想要的语法,或者你想知道为什么以及何时使用它? – 2009-08-12 18:56:57

+5

http://stackoverflow.com/users/124339/johanna什么是所有的“什么是..”的问题? – 2009-08-12 19:21:43

+2

-1您不断提问在每个教程中都很容易回答的问题,甚至可以获得相当大的声誉。我认为这不是诚实的。 – 2009-08-13 07:32:45

回答

7

这是一个以互斥方式构建的java。这用于多线程应用程序。

Sun concurrency tutorial

这有一个关于同步部分,但你应该看整个事情,如果你要使用多线程应用程序。

Wiki mutex

3

一次只能有一个线程访问同步块。

这是一个基本的语言结构。如果您完全不熟悉它,则需要查看。

8

这些都是用来当你构建许多“线程”的程序进行。当main启动时,它从一个线程开始,它按顺序执行这些步骤。您可以启动更多的线程,然后可以同时执行代码。如果你在同一时间执行相同的代码,事情可能的方式表现你不想:

y = x+20; 
// at this moment, before the next instruction starts, some other thread performs 
// the above step, which sets 'y' (an object property) to something different. 
int b = y+10; // this would not be x+20, as you might expect. 

你想要做的就是把在这个代码块“锁定”的,为了使它确保没有其他线程可以开始执行变量y上“同步”的任何代码。

synchronized (y) { 
    y = x+20; 
    int b = y+10; 
} // lock gets released here 

现在,所有其他线程必须等待哪个线程最先到达那里退出块和解除锁定,此时另一个线程获取锁,进入的代码块,执行它,并释放锁。请注意,y必须是一个对象(整数),而不是原始类型。

您还可以在'this'(实例对象)上同步的方法中添加'synchronized',或者在静态方法中同时添加'synchronized'。

编写多线程代码很困难,因为这样的问题。同步是一个工具,尽管它有一个主要问题 - 死锁。网上有很多关于死锁的信息。

4

它创建了一段关于两个或更多线程的代码,可以(a)一次仅由一个线程执行,并且(b)形成内存屏障

虽然理解互斥的概念可以防止代码的并发执行非常简单,但同样重要的是内存障碍。

内存屏障形成两个线程之间的“发生之前”关系。在获取锁之前,线程对内存所做的任何更改都会被其他线程在获取相同的锁之后保证被观察到。由于CPU高速缓存及其与主内存交互的影响,这对于防止观察和更新陈旧的高速缓存内存以及防止线程之间的竞争条件至关重要。

+1

+1对其他线程的可见性的重要性往往被忽略 – 2009-08-13 11:51:59

1

调用对象的同步实例方法获取对象的锁定,调用类的同步静态方法获取对类的锁定。在方法中执行代码块时,可以使用synchronized语句来获取对任何对象的锁定,而不仅仅是此对象。该块被称为同步块。同步声明的一般形式如下: synchronized (expr) { statements; } 表达式expr必须计算为对象引用。如果该对象已被另一个线程锁定,该线程将被锁定,直到释放该锁。当在对象上获得锁定时,将执行同步块中的语句,然后解除锁定。