1. 线程同步有机制会遇到如下情况:在服务器被每个客户端请求时,涉及到大量的线程使用,使得每个客户端在请求时得到服务器端的响应。当存在资源共享时,我们需要使用锁机制让共享资源处于临界区,避免多个线程处于争夺状态。如果一个资源是多个线程共享的,为了保证数据的完整性,在进行事务性操作时需要将共享资源锁定,这样可以保证只有一个线程能对资源进行操作,从而保证了数据的完整性.在J2SE5.0以前锁定的功能是由synchronized关键字来实现的. J2SE 5.0后新特性实现锁定,包括一般的锁、读写锁等.关键技术剖析:
1.1 synchronized关键字关键字synchronized修饰某个对象后,该对象就成为监视器(monitor)。每个对象都可以作为一个监视器,这个监视器用来保证在任一时刻,只能有一个线程访问该对象,使得线程在临界区同步起来,此时避免了可能引起的冲突。Synchronized有如下三种用法:
(1)synchronized代码块:监视器就是指定的对象。
(2)synchronized方法:监视器就是this对象。
(3)synchronized静态方法:监视器就是相应的类。
2 Lock机制在J2SE5.0中的锁是由java.util.concurrent.locks .lock实现的,使用它的关键技术点如下:
(1)ReentrantLock类实现了Lock接口,通过它可以完全取代synchronized关键字.
(2)ReentrantLock的lock方法取得锁,如果该锁定没有被其他线程占据,则获取该锁定并返回,将保持计数器置为1;如果当前线程已经占据锁,则立即返回,将保持计数器加1;如果锁定被其他线程占据,则当前线程进入睡眠状态,等待其他线程释放锁,此时保持计数器置为1.
(3)ReentrantLock的unlock方法释放锁,如果当前线程是锁的占有者,则将保持计数器减1,如果保持计数器等于0,则释放锁.如果当前线程不是锁的占有者,则抛出异常.
(4)ReadWriteLock是一个继承Lock的接口,定义了读写锁.它的一个实现类是ReentrantReadWriteLock
(5)ReentrantReadWriteLock的writeLock方法获得用于写入操作的锁定,当获得写入锁时,其他线程想进行读写操作都必须等待.
(6)ReentrantReadWriteLock的readLock方法获得用于读操作的锁定,当获得读取锁时,其他读的线程可以继续获得读取锁,但是不能获得写入锁。
3.线程死锁notify()或notifyAll()来源于Object,用来唤醒线程,是对应synchronized的,避免线程死锁。程序员在编程过程中考虑“死锁”的潜在危险,同时程序员时刻记住,当共享资源使用结束时一定要记得在finally块使用unlock解锁。