我正在学习 java 多线程,我发现很难理解同步块的工作原理:
synchronized(Object o){
// do something
}
请给出一些示例代码,可以显示对象 o 被阻止。据我了解,在执行同步块时,从另一个线程访问对象 o 将被阻止?
我正在学习 java 多线程,我发现很难理解同步块的工作原理:
synchronized(Object o){
// do something
}
请给出一些示例代码,可以显示对象 o 被阻止。据我了解,在执行同步块时,从另一个线程访问对象 o 将被阻止?
Java中的同步是一个重要的概念,因为Java是一种多线程语言,其中多个线程并行运行以完成程序执行。在多线程环境中,java对象的同步或java类的同步变得极为重要。Java 中的同步可以通过使用 java 关键字“synchronized”和“volatile”来实现。Java 中共享对象的并发访问会引入一种错误:线程干扰和内存一致性错误,为了避免这些错误,您需要将您的 java 对象正确同步到允许临界区对两个线程的互斥访问。
阅读更多:http: //javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html#ixzz2LOWwnCjH
请看这个例子
同步描述了如果一个对象或一个块被声明为同步,那么一次只有一个进程可以访问该对象或块。没有其他进程可以获取该对象或块,直到它可用。在内部每个对象都有一个名为“锁”的标志" 有两个状态设置和重置。当一个进程请求一个对象时,它会检查锁定值是设置还是重置。取决于一个对象是否可用于同步的进程。为了更好地理解示例,您可以查看此链接。 在此处输入链接描述
由于大多数答案都涵盖了同步的含义,因此我想添加一个未提及的额外点。同步一个方法或用 synchronized 封闭一个块可确保操作/一组操作作为单个原子操作执行,准确地说,当一个线程在对象上执行同步块时,其他线程无法进入该块,直到线程完成其执行并释放它在进入块时获得的锁。
所以同步块保证了一堆代码语句的原子性。
与@lucifier 指定的不同,同步和 volatile 的目的不同,volatile 旨在确保两个线程相互通信并从主内存中获取最多的更新值,而不是从单个缓存中获取值。它也确保执行的“发生在”行为之前。
例如,将变量定义为 volatile(volatile int i=10;) 在非同步方法中执行增量操作 (i++;) 不会在 (i++) 包含在同步块中时给出相同的行为。