synchronized&synchronized(something)与对象锁

来源:互联网 发布:怎么用网络电视看cctv5 编辑:程序博客网 时间:2024/06/07 00:16

      Java中同步机制可以用synchronized关键字来实现,当然了,其他办法也是有的。先从synchronized这个关键字说起吧。

      首先synchronized关键字可以用来修饰对象的方法,对象的方法有静态方法与非静态方法;其次,synchronized可以修饰语句块。使用 synchronized关键字的语句块要先获得synchronized(something)中something所对应的锁,这个 something可能有很多种。

      Java中的每个对象都对应一把锁,并且同时只能有一个线程获得该锁,如任何Object的实例或者其子类的实例都有唯一的锁。类似SomeClass.class的大家估计也经常用到,它也是Object的子类,也拥有唯一的锁。但是相同的线程可以多次获取同一对象的唯一锁。比如说在一个同步方法内调用了另一个同步方法的情况。对于每一把唯一锁都有一个计数器来表明当前锁被持有情况。进入同步方法或者同步块是计数器加1,退出时减1。

      最普通的用法是:

           

[java] view plaincopyprint?
  1. public synchronized void function(){//op}  
 

      此时执行此方法需要获得此方法所属的类的当前实例的锁,也就是说this变量所指代的对象的锁。所以上面的语句和以下语句是等效的:

           

[java] view plaincopyprint?
  1. synchronized(this){//op}   

      假设function是SomeClass的一个方法,

[java] view plaincopyprint?
  1. SomeClass sc = new SomeClass();  
  则多个线程调用sc.function()时同时只能有一个线程执行此方法,因为所有线程都先要获得sc对象所拥有的唯一锁。但是当有多个SomeClass的实例如sc1,sc2,sc3...,此时同一个线程同时调用sc1.function(),sc2.function()...时是互不影响的,因为他们要获得的锁不是同一对象的唯一锁,而是多个对象的多把锁,互不影响。

 

一般银行存取款 : 只有一个sc ,其他的sc1,sc2,sc3 ,都是不同的卡,所以互不影响 。

(生产者消费者问题,一般模拟的都是同一个生产者或者消费者的对象的多线程,其实现实中,多个生产者或消费者应该是不同的对象,银行取款是比较形象的)

 

      还有就是synchronized修饰static方法:

           

[java] view plaincopyprint?
  1. public synchronized static void function(){//op}  
 

      此时要执行该方法需要获得此方法所属的类SomeClass对应的SomeClass.class对象的锁。我们知道每个类如SomeClass对应的都有且只有一个SomeClass.class实例。此时多个线程执行此方法时,都要获得所属类的唯一关联实例SomeClass.class所对应的锁,所以无论何时都只有一个线程可以执行此方法。

 

      在使用synchronized同步块时同同步方法基本一样的效果。同步普通的非静态实例时获得该实例所对应的锁,同步静态实例变量是同同步静态方法一样都需要获得其所属类对应的唯一SomeClass.class实例的锁,即类锁。

在程序中获取类锁可以尝试用以下方式获取类锁synchronized (xxx.class) {...}synchronized (Class.forName("xxx")) {...}同时获取2类锁同时获取类锁和对象锁是允许的,并不会产生任何问题,但使用类锁时一定要注意,一旦产生类锁的嵌套获取的话,就会产生死锁,因为每个class在内存中都只能生成一个Class实例对象。

 

 

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 护照在大使馆办签证期间出国怎么办 法院两次判决不准离婚我该怎么办? 法院判决不准离婚妻子不回来怎么办 被告人在不调解的情况下怎么办 知道弟兄的孩子是别人的怎么办? 办居住证的回执单丢了怎么办 领取居住证的回执单丢了怎么办 北京居住证网上申报信息填错怎么办 买家退回来的货有问题怎么办 居转户过程中生的小孩户口怎么办 人才引进申请上海户口被拒怎么办 网络购高铁票身份证没有验证怎么办 高速遇到很浓的团雾怎么办 对于大巴不按座位坐的人该怎么办 火车上遇到占座不让的人怎么办 滁州婴儿打疫苗的绿本子怎么办 检查四维说宝宝嘴巴显示不清怎么办 携程订票付款成功一直没出票怎么办 手机微信支付密码忘了怎么办 存入卡里的钱却说余额不足怎么办 买高铁票身份证未通过审核怎么办 网上订演出票不配送了怎么办 百度糯米订的演出票不配送了怎么办 高铁误点改签后的车次没票了怎么办 高铁晚点没赶上下班车怎么办 上班期间单位没给交养老保险怎么办 一键启动车钥匙遥控失灵怎么办 已经订购的火车票误了火车怎么办 飞机去程取消分开买的返程怎么办 订完学生票发现使用次数过了怎么办 坐火车买学生票没带学生证怎么办 买了学生票学生证磁条没了怎么办 买了动车学生票没带学生证怎么办 身份证没磁了怎么办能买火车票 格力空调保修单丢了怎么办 格力空调保修期内坏了怎么办 国际联程航班第一程延误怎么办 大麦网演唱会的票售罄了怎么办 国内转机航班第一班延误了怎么办 联程机票下一程航班被取消怎么办 联程机票第一班航班取消怎么办