Java中线程的同步

时间:2021-01-16 18:32:41
      在多线程的程序设计中,可能会出现多个线程的代码段访问同一个资源的情况,这个代码段通常被称为临界区,这种情况有可能导致程序的错误,例如,如果一个线程在未完成对某一变量的读操作时,另一个线程又对该变量进行了写操作,那么第一个线程读入的变量值可能是一种修改过程中的不稳定值。对这类问题的解决通常都是给临界区加锁,使得这段对资源的操作成为一个原子操作。

在Java中实现线程的同步通常有两种方式(同步方法和同步块):


同步块:即将临界区的代码封在一个同步块内,如下例所示:
synchronized(object)
{
    critical code;
}
这个object对象可以是任意的Java对象,只要这个对象能够被所有线程共享就可以了!

同步方法:即将临界区封装在一个同步方法中,如下例:
synchronized void operate(arg1, arg2, arg3, ...)
{
    critical code;
}

注意:实际上这两种方式的原理是一致的,都是通过给临界区加锁来完成线程的同步的,在Java中每一个对象内部都有一个对象锁,当有一个线程进入到临界区后就会对对象加锁(在同步块中这个对象是明确制定的,即上面的object,而在同步方法中这个对象默认的就是指this对象),当走出临界区的时候就对这个对象解锁,由此来控制其他线程进出临界区。

注意:由于静态成员和静态方法是类所有的,对于静态方法的同步,我们就不可能通过对this对象加锁来完成,实际上在Java中每一个类内部都有一个class类对象,静态方法的同步就是通过对这个对象加锁来完成的。