演示Java同步块的示例代码

25

我正在学习Java多线程,我发现很难理解同步块的工作原理:

 synchronized(Object o){
     // do something
    }
请给出一些示例代码,以显示对象o被阻塞。 就我所理解的而言,在synchronized块正在执行时,从另一个线程访问对象o将会被阻塞。
3个回答

14
在Java中,同步是一个重要的概念,因为Java是一种多线程语言,多个线程并行运行以完成程序执行。在多线程环境中,Java对象的同步或Java类的同步变得非常重要。使用Java关键字“synchronized”和“volatile”可以实现Java中的同步。在Java中共享对象的并发访问会引入两种错误:线程干扰和内存一致性错误,为了避免这些错误,您需要适当地同步Java对象,以允许两个线程互斥地访问关键部分。
更多信息请访问:http://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html#ixzz2LOWwnCjH 请查看此示例

1

同步化是指如果一个对象或块被声明为同步的,那么只有一个进程可以同时访问该对象或块。在可用之前,其他进程不能获取该对象或块。内部每个对象都有一个称为"锁"的标志,有两种状态设置和重置。当一个进程请求一个对象时,它会检查锁值是设置还是重置。根据这个,一个对象在同步中对一个进程是可用的。为了更好地理解,您可以查看这个链接。 输入链接描述


虽然这可能回答了问题,但问题已经得到解答。请详细说明您的答案与已有的答案(并且被接受)有何不同 - 或者它如何扩展了它们。 - T3 H40

0

由于大多数答案已经涵盖了同步的含义,我想补充一点没有提到的额外观点。 通过同步方法或使用同步块可以确保操作/一组操作作为单个原子操作执行,确切地说,当一个线程正在执行对象上的同步块时,直到线程一完成其执行并释放它进入块时获得的锁,其他线程都不能进入该块。

因此,同步块确保了一堆代码语句的原子性。

与@lucifier指定的不同,同步和易失性并不具有相同的目的,易失性旨在确保两个线程彼此通信并从主内存中获取最新值,而不是从各自缓存中访问值。 它还确保了执行的“先行发生”行为。

例如,将变量定义为volatile(volatile int i = 10;)并在未同步的方法中执行递增操作(i ++;)与将其包含在同步块中时不会产生相同的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接