用于显示java synchronized块如何工作的示例代码

时间:2011-11-17 03:54:18

标签: java thread-synchronization

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

 synchronized(Object o){
     // do something
    }

请给出一些示例代码,可以显示对象o被阻止。根据我的理解,在同步块被执行时,将阻止从另一个线程访问对象?

3 个答案:

答案 0 :(得分:11)

  

Java中的同步是一个重要的概念,因为Java是一种多线程语言,其中多个线程并行运行以完成程序执行。在多线程环境中,java对象的同步或java类的同步变得极为重要。使用Java关键字“synchronized”和“volatile”可以实现Java中的同步.Java中共享对象的并发访问引入了一种错误:线程干扰和内存一致性错误,为了避免这些错误,您需要正确地将java对象同步到允许对两个线程进行关键部分的互斥访问。

了解详情:http://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html#ixzz2LOWwnCjH

请查看此Example

答案 1 :(得分:1)

同步描述了如果一个对象或一个块被声明为synchronized,那么一次只有一个进程可以访问该对象或块。没有其他进程可以获取该对象或块直到它可用。内部每个对象都有一个标志命名"锁定"有两个状态设置和重置。当进程请求一个对象时,则检查锁定值是设置还是重置。取决于一个对象可用于同步进程。为了更好地理解示例,您可以看到此链接。 enter link description here

答案 2 :(得分:0)

由于大部分答案都涵盖了同步意味着我想添加一个额外的点,而这一点并未被提及。 同步方法或用同步封闭块确保操作/操作集作为单个原子操作执行,准确地说,当一个线程正在对象上执行同步块时,没有其他线程可以进入块,直到线程一完成其执行并释放它在进入块时获得的锁定。

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

与@lucifier指定的不同,Synchronizing和volatile不能用于同一目的,volatile意味着确保两个线程相互通信并从主内存中获取最大的更新值,而不是从中获取值个人cache.it也确保"发生在"执行的行为。

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