我正在学习Java多线程,我发现很难理解同步块的工作原理:
synchronized(Object o){
// do something
}
请给出一些示例代码,以显示对象o被阻塞。 就我所理解的而言,在synchronized块正在执行时,从另一个线程访问对象o将会被阻塞。我正在学习Java多线程,我发现很难理解同步块的工作原理:
synchronized(Object o){
// do something
}
请给出一些示例代码,以显示对象o被阻塞。 就我所理解的而言,在synchronized块正在执行时,从另一个线程访问对象o将会被阻塞。同步化是指如果一个对象或块被声明为同步的,那么只有一个进程可以同时访问该对象或块。在可用之前,其他进程不能获取该对象或块。内部每个对象都有一个称为"锁"的标志,有两种状态设置和重置。当一个进程请求一个对象时,它会检查锁值是设置还是重置。根据这个,一个对象在同步中对一个进程是可用的。为了更好地理解,您可以查看这个链接。 输入链接描述
由于大多数答案已经涵盖了同步的含义,我想补充一点没有提到的额外观点。 通过同步方法或使用同步块可以确保操作/一组操作作为单个原子操作执行,确切地说,当一个线程正在执行对象上的同步块时,直到线程一完成其执行并释放它进入块时获得的锁,其他线程都不能进入该块。
因此,同步块确保了一堆代码语句的原子性。
与@lucifier指定的不同,同步和易失性并不具有相同的目的,易失性旨在确保两个线程彼此通信并从主内存中获取最新值,而不是从各自缓存中访问值。 它还确保了执行的“先行发生”行为。
例如,将变量定义为volatile(volatile int i = 10;)并在未同步的方法中执行递增操作(i ++;)与将其包含在同步块中时不会产生相同的行为。