同步和多线程的关系:1.没有多线程环境就不需要同步。2.即使有多线程环境也不一定需要同步。
一旦一个线程处于一个标记为synchronized的方法中,那么在这个线程从该方法中返回之前,其他所有要调用类中任何标记为synchronized方法的线程都会被阻塞。
每个对象都有一个单一的锁,这个锁本身就是对象的一部分。当在对象上调用其任意synchronized方法的时候,此对象都被加锁,这是该对象上的其他synchronized方法只有等到前一个方法调用完毕并释放了锁之后才能被调用。
原子操作不需要进行同步(对除double和long以外的其他基本类型的进行读取或赋值的操作也是原子操作。然而,只要给long或double加上volatile,操作就是原子操作了。)
只能在同步控制方法或同步块中调用wait()、notify()和notifyAll()。如果在非同步的方法里调用这些方法,在运行时会抛出java.lang.IllegalMonitorStateException异常。
在调用wait的时候,线程自动释放其占有的对象锁,同时不会去申请对象锁。当线程被唤醒的时候,它才再次获得了去获得对象锁的权利。notify仅唤醒一个线程并允许它去获得锁,notifyAll是唤醒所有等待这个对象的线程并允许它们去获得对象锁。