Java线程同步锁

        Java中JDK1.5之后,出了另一种线程同步机制,通过显示定义同步锁来进行同步:

ReadWriteLock(读写锁):允许多个线程并发访问共享资源。

ReentrantLock(可重入锁):实现线程安全的控制,一般用这个。

使用lock对象可以显示实现 加锁、释放锁。

格式如下

class x{

    //定义锁对象

    private ReentrantLock lock= new  ReentrantLock();

    //需要保证线程安全的方法

    public void run(){

        //加锁

        lock.lock();

        try{

            //保证线程安全的代码

            ……..    

        }

        //一般使用finally释放锁

        finally{

        lock.unlock();

        }

    }

}


代码举例

        上面的Account类中,当多个线程并发执行draw方法的时候,一次只能有一个线程进行加锁...解锁操作,通过这样,我们来保证对共享资源的安全的操作!



说完了线程同步,我们这里来说一下,使用线程同步我们可能遇到的问题,线程死锁!

        当两个线程互相等待对方释放同步监视器的时候就会发生死锁。(死锁不会报错,也不会异常,更不会提示,所有线程进入阻塞状态,无法继续)

当系统出现多个同步监视器的情况下,容易死锁,如下面的例子:


线程A


线程B


测试

        从运行结果来看,很明显,主线程进入A实例的eat方法时,准备调用B实例的speek()方法,子线程也进入了B实例的eat方法,准备调用A实例的speek()方法,但是主线程等待B实例试图获取同步监视器,子线程等待A实例试图获取同步监视器,由于各自线程执行都没有完成,所以无法释放同步监视器,造成了线程的死锁。

因此,我们在使用线程同步的时候,应当考虑到这个,避免线程死锁的问题出现。


----------------上一节“Java-线程同步方法”-------------------

----------------下一节“Java-线程的协调运行”------------------

你可能感兴趣的:(Java线程同步锁)