我正在学习java多线程,我发现很难理解synchronized块的工作原理:
synchronized(Object o){
// do something
}
请给出一些示例代码,可以显示对象o被阻止。根据我的理解,在同步块被执行时,将阻止从另一个线程访问对象?
答案 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 ++;)不会产生相同的行为。