什么是synchronized语句用于?

时间:2009-08-12 18:50:25

标签: java synchronization

synchronized语句的用法是什么?

5 个答案:

答案 0 :(得分:12)

这些用于构建具有许多“线程”的程序时。当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必须是对象(整数),而不是基本类型。

您还可以将“synchronized”添加到方法中,这些方法在“this”(实例对象)上进行同步,或者在静态方法的情况下进行同步。

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

答案 1 :(得分:7)

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

Sun concurrency tutorial

这是一个关于synchronized的部分,但如果您尝试使用多线程应用程序,则应阅读整个内容。

Wiki mutex

答案 2 :(得分:4)

它创建了一段代码,对于两个或多个线程,它可以(a)一次只能由一个线程执行,(b)形成内存屏障。 / p>

虽然理解互斥的概念阻止了代码的并发执行非常容易,但同样重要的是内存障碍。

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

答案 3 :(得分:3)

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

这是一种基本的语言结构。如果您对它不熟悉,则需要进行审核。

答案 4 :(得分:1)

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