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-线程的协调运行”------------------

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    小徐andorid阅读 2,994评论 3 53
  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 1,804评论 0 12
  • 线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或...
    闽越布衣阅读 809评论 0 6
  • 最近几天气压很低,不想学习,不想听课,不想做计划。 除了强制自己早起和做早餐,似乎没有一点点进步。 客户资金到账了...
    心灵的摆渡人陈厚阅读 554评论 15 5
  • 昨天来到北京,去参观了国家博物馆,去年就想来的地方,今年实现了,不同的是来的人不一样而已。参观玩之后,感觉自己就是...
    柠檬安然阅读 152评论 0 0

友情链接更多精彩内容