同步代码块实现线程同步和通信
线程同步是通过同步监视器实现的,也就是我们所说的锁,而同步监视器一般是共享资源。一个线程在访问共享资源的时候需要对其上锁,锁未释放前其他线程就不能访问该共享资源。例如:A线程对共享资源P进行操作期间会对其上锁,B线程要访问P却发现其是上锁的,故等待A释放锁后才能对其访问。
线程通信是通过调用Object类中定义和实现的的wait()和notify()或者notifyAll()方法实现的,因为同步监视器本身是new出来的某个类的一个对象,故可通过对象.方法调用这些通信方法。
同步方法实现线程同步和通信
线程同步也是通过同步监视器实现的,非静态同步方法的锁是当前调用该方法的this对象,静态同步方法的锁是静态方法拥有类的字节码文件对象,称为类对象,通过类名.class可以获得(关于什么是类对象请参考Java映射中的知识)。
线程通信同同步代码块中类似,通过**同步监视器.wait()或.notify()**调用。
Lock锁实现线程同步和通信
Lock锁创建一个锁对象,当一个线程在使用这把锁时,其他线程不能使用它,也就是说现在只有一把锁,想用锁的话必须等待锁空闲了才能用。Lock锁中没有同步监视器。每个线程在对共享资源进行操作时必须上锁,如果锁被占用了说明有一个线程正在访问共享资源,其他线程必须等待锁用完了后拿到锁才能对共享资源进行访问。上锁通过lock()方法,释放锁通过unlock()方法。通信时使用Condition对象的await()和signal()方法。