php synchronized,synchronized的4种用法

1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.

例如:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicsynchronizedvoidsynMethod()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//方法体8f1ba5b45633e9678d1db480c16cae3f.png}

2.对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.此时,线程获得的是成员锁.例如:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicintsynMethod(inta1)9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        synchronized(a1)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//一次只能有一个线程进入ecedf933ec37d714bd4c2545da43add2.png}8f1ba5b45633e9678d1db480c16cae3f.png      }

3.synchronized后面括号里是一对象,此时,线程获得的是对象锁.例如:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassMyThread implements Runnable9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicstaticvoidmain(String args[])9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    MyThread mt=newMyThread();

d18c02628675d0a2c816449d98bda930.png    Thread t1=newThread(mt,"t1");

d18c02628675d0a2c816449d98bda930.png    Thread t2=newThread(mt,"t2");

d18c02628675d0a2c816449d98bda930.png    Thread t3=newThread(mt,"t3");

d18c02628675d0a2c816449d98bda930.png    Thread t4=newThread(mt,"t4");

d18c02628675d0a2c816449d98bda930.png    Thread t5=newThread(mt,"t5");

d18c02628675d0a2c816449d98bda930.png    Thread t6=newThread(mt,"t6");

d18c02628675d0a2c816449d98bda930.png    t1.start();

d18c02628675d0a2c816449d98bda930.png    t2.start();

d18c02628675d0a2c816449d98bda930.png    t3.start();

d18c02628675d0a2c816449d98bda930.png    t4.start();

d18c02628675d0a2c816449d98bda930.png    t5.start();

d18c02628675d0a2c816449d98bda930.png    t6.start();

ecedf933ec37d714bd4c2545da43add2.png  }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidrun()9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif    synchronized (this)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png      System.out.println(Thread.currentThread().getName());

ecedf933ec37d714bd4c2545da43add2.png    }ecedf933ec37d714bd4c2545da43add2.png  }8f1ba5b45633e9678d1db480c16cae3f.png}4f1150b881333f12a311ae9ef34da474.png 

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

对于3,如果线程进入,则得到当前对象锁,那么别的线程在该类所有对象上的任何操作都不能进行.在对象级使用锁通常是一种比较粗糙的方法。为什么要将整个对象都上锁,而不允许其他线程短暂地使用对象中其他同步方法来访问共享资源?如果一个对象拥有多个资源,就不需要只为了让一个线程使用其中一部分资源,就将所有线程都锁在外面。由于每个对象都有锁,可以如下所示使用虚拟对象来上锁:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifclassFineGrainLock9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png   MyMemberClass x, y;

d18c02628675d0a2c816449d98bda930.png   Object xlock=newObject(), ylock=newObject();

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidfoo()9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif      synchronized(xlock)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//access x hereecedf933ec37d714bd4c2545da43add2.png}d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//do something here - but don't use shared resourcesd18c02628675d0a2c816449d98bda930.png97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif      synchronized(ylock)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//access y hereecedf933ec37d714bd4c2545da43add2.png}ecedf933ec37d714bd4c2545da43add2.png   }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidbar()9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif      synchronized(this)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//access both x and y hereecedf933ec37d714bd4c2545da43add2.png}d18c02628675d0a2c816449d98bda930.png//do something here - but don't use shared resourcesecedf933ec37d714bd4c2545da43add2.png}8f1ba5b45633e9678d1db480c16cae3f.png  }4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

4.synchronized后面括号里是类,此时,线程获得的是对象锁.例如:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifclassArrayWithLockOrder9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngprivatestaticlongnum_locks=0;

d18c02628675d0a2c816449d98bda930.pngprivatelonglock_order;

d18c02628675d0a2c816449d98bda930.pngprivateint[] arr;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngpublicArrayWithLockOrder(int[] a)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    arr=a;

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif    synchronized(ArrayWithLockOrder.class)9b8a8a44dd1c74ae49c20a7cd451974e.png{//-----这里d18c02628675d0a2c816449d98bda930.pngnum_locks++;//锁数加 1。d18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.png      lock_order=num_locks;//为此对象实例设置唯一的 lock_order。ecedf933ec37d714bd4c2545da43add2.png}ecedf933ec37d714bd4c2545da43add2.png  }d18c02628675d0a2c816449d98bda930.pngpubliclonglockOrder()

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturnlock_order;

ecedf933ec37d714bd4c2545da43add2.png  }d18c02628675d0a2c816449d98bda930.pngpublicint[] array()

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturnarr;

ecedf933ec37d714bd4c2545da43add2.png  }8f1ba5b45633e9678d1db480c16cae3f.png  }4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngclassSomeClass implements Runnable

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngpublicintsumArrays(ArrayWithLockOrder a1,

d18c02628675d0a2c816449d98bda930.png                       ArrayWithLockOrder a2)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngintvalue=0;

d18c02628675d0a2c816449d98bda930.png    ArrayWithLockOrder first=a1;//保留数组引用的一个d18c02628675d0a2c816449d98bda930.pngArrayWithLockOrder last=a2;//本地副本。d18c02628675d0a2c816449d98bda930.pngintsize=a1.array().length;

d18c02628675d0a2c816449d98bda930.pngif(size==a2.array().length)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngif(a1.lockOrder()>a2.lockOrder())//确定并设置对象的锁定97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{//顺序。d18c02628675d0a2c816449d98bda930.pngfirst=a2;

d18c02628675d0a2c816449d98bda930.png        last=a1;

ecedf933ec37d714bd4c2545da43add2.png      }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif      synchronized(first)9b8a8a44dd1c74ae49c20a7cd451974e.png{//按正确的顺序锁定对象。97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifsynchronized(last)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngint[] arr1=a1.array();

d18c02628675d0a2c816449d98bda930.pngint[] arr2=a2.array();

d18c02628675d0a2c816449d98bda930.pngfor(inti=0; i

d18c02628675d0a2c816449d98bda930.png            value+=arr1[i]+arr2[i];

ecedf933ec37d714bd4c2545da43add2.png        }ecedf933ec37d714bd4c2545da43add2.png      }ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.pngreturnvalue;

d18c02628675d0a2c816449d98bda930.png

ecedf933ec37d714bd4c2545da43add2.png  }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidrun()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//9b8a8a44dd1c74ae49c20a7cd451974e.pngecedf933ec37d714bd4c2545da43add2.png}8f1ba5b45633e9678d1db480c16cae3f.png  }4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

对于4,如果线程进入,则线程在该类中所有操作不能进行,包括静态变量和静态方法,实际上,对于含有静态方法和静态变量的代码块的同步,我们通常用4来加锁.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值