同步代码块:
当多个线程使用同一个共享资源时,可以将处理共享资源的代码块中,使用synchronized关键字来修饰,被称作同步代码块,其语句格式如下:
synchronized(lock){
操作共享资源代码块
}
上面的代码中,lock是一个锁对象,它是同步代码块的关键。当线程执行同步代码块时,首先会检查锁对象的标志位,默认情况下标志位1,此时线程会执行同步代码块,同时锁对象的标志位置为0。当一个新的线程执行到这个段同步代码块时,由于锁对象的标志位为0,新线程就会发生阻塞,等待当前线程执行完同步代码块后,锁对象的标志位被置为1,线程才能进入同步代码块执行其中的代码。循环往复,直到共享资源被处理完为止。
同步方法:
在方法前面同样可以使用synchronized关键字来修饰,被修饰的方法为同步方法,它能实现和同步代码块同样的功能,具体语法格式如下:
synchronized 返回值类型 方法名([参数1,...]){ }
被synchronized 修饰的方法在某一时刻只允许一个线程访问,访问该方法的其他线程都会发生阻塞,直到当前线程访问完后,其他线程才有机会执行方法。
死锁:
是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
wait():使当前线程放弃同步锁并进入等待状态,直到其他线程进入此同步锁,并调用notify()方法,或notifyAll()方法唤醒该线程为止。
void notify():唤醒此同步锁上等待的第一个调用wait()方法的线程。
notifyAll():唤醒此同步锁上调用wait()方法的所有线程。
