Java线程锁synchronized理解

     ok,闲话不说,上重要东西。。。

     所有对象都含有单一的锁(也称监视器)。当在对象上调用其任意synchronized方法时候,此对象都加上锁,这时候该对象上的其他synchronized方法只有等到前一个方法调用完毕释放了锁之后才能被调用。对于前面的方法,如果某任务对对象调用了f(),对于同一个对象而言,就只能等到f()调用结束并释放了锁之后,其他任务才能调用f()和g().所以,对于某个特定的对象来说,其所有的synchronized方法共享同一个锁,这可以被用来防止多个任务同时访问被编码为对象内存。

     一个任务可以多次获得对象的锁,如果一个方法在同一个对象上调用了第二个方法,后者又调用了同一对象上的另一个方法,就会发生这种情况。JVM负责跟踪对象被加锁的时候,计数变为1.每当这个相同的任务在这个对象上获得锁时,计数都会递增。显然,之后首先获得了锁的任务才能允许继续获取多个锁。每当任务离开一个synchroinized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务就可以使用此资源。

    针对每个类,也有一个锁(作为Class对象的一部分),所以synchronized static方法可以在类的方法内防止对static数据的并发访问。

    有时,你只是希望防止多线程同时访问方法内部的部分代码而不是防止访问整个方法。通过这种方式分离出来的代码被称为临界区,它也使用synchronized关键字建立,这里,synchroized被用来制定某个对象

   synchronized(syncObject){

}

    这个被称为同步控制块 在进入此代码前,必须得到syncObject对象的锁。

   

    说了这么多就两种锁 一个是对象的锁,一个是Class类的锁 但是Class类对象也是一个对象。所有的锁都能归结为对象锁。Class对象的锁 锁的是静态方法,而普通对象锁锁的是普通的。不论是类的锁还是方法的锁 需要用的时候 必须要获取它对象的锁。

   

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值