中易网

php有没有synchronized

答案:1  悬赏:0  
解决时间 2021-01-18 12:25
  • 提问者网友:情歌越听越心酸
  • 2021-01-17 11:29
php有没有synchronized
最佳答案
  • 二级知识专家网友:琴狂剑也妄
  • 2021-01-17 12:40
synchronized用到不同地方对代码产生的影响:
  1. synchronized关键字修饰方法
  假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都能够调用他们。
  public synchronized void method(){
  //
  }
  这也就是同步方法,那这时synchronized锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,他们之间会形成互斥,达到同步的效果。同时如果该对象中有多个同步方法,则当一个线程获执行对象中的一个synchronized方法,则该对象中其它同步方法也不允许别的线程执行。但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了synchronized关键字的方法。
  上边的示例代码等同于如下代码:
  public void method() {
  synchronized (this)
  {
  //..
  }
  }
  此次就是一个P1对象的对象锁,哪个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程式也可能在这种情形下摆脱同步机制的控制,造成数据混乱。
  2.同步块,示例代码如下:
  public void method(SomeObject so) {
  synchronized(so)
  {
  //..
  }
  }
  这时,锁就是so这个对象,每个对象对应一个唯一的锁,所以哪个线程拿到这个对象锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够 这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
  private byte[] lock = new byte[0];
  Public void method(){
  synchronized(lock)
  {
  //
  }
  }
  PS:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。
  3.将synchronized作用于static 函数,示例代码如下:
  Class Foo
  {
  public synchronized static void method1()
  {
  //.
  }
  public void method2()
  {
  synchronized(Foo.class)
  //
  }
  }
  这两个同步方法都调用这个方法的对象所属的类的类锁(Class,而不再是由这个Class产生的某个具体对象了)。
  能够推断:假如一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为他们的锁都不相同。A方法的锁是Obj所 属的那个Class,而B的锁是Obj所属的这个对象。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息