关于java:“同步”到底是做什么的?

What does “synchronize” exactly do?

本问题已经有最佳答案,请猛点这里访问。

我有一个问题,听起来很基本,但在这里。正如在Java中众所周知的,EDCOX1×0×关键字用于处理访问一个特定实例的多线程。现在假设一个实例A有一个同步方法do()。这是否意味着,如果一个线程T1执行方法do()并因此获得a的锁,那么在T1释放锁之前(即使其他方法不同步),其他线程都不会访问实例a?或者它意味着除了一次只能由一个线程执行的特定do()方法外,所有未同步的方法(或代码块)都是可访问的?


直接来自Java文档:

It is not possible for two invocations of synchronized methods on the same object to interleave. When one thread is executing a synchronized method for an object, all other threads that invoke synchronized methods for the same object block (suspend execution) until the first thread is done with the object.

因此,你的后一种解释是正确的。


如果T1在方法do()上得到一个锁,即方法在synchronized块下。程序的其他部分,比如方法display()不同步,其他线程就可以访问这个方法。所以你的或是正确的。


同步方法确保不会同时为多个对象实例调用此方法,并且在同步方法执行期间,在开始执行该方法之前,将刷新所有关联的实例变量。