Java 中lock和synchronized关键词的区别

locksynchronized不同:
synchronized获得锁和释放的方式都是在块结构中,当获取多个锁的时候必须以相反的顺序释放,并且是自动解锁
LockJDK1.5以后引进的,它相比synchronized关键词要更灵活,可用范围更广泛

用法:
我们来看一个计数器的例子来比较这两者的不同:
1. synchronized

1

2

3

4

5

6

7

8

9

10

11

publicclassCounter {

 

  privateintcount =0;

 

  publicintinc() {

      synchronized(this) {

           return++count;

     }

   }

}


//加了synchronized关键词后,count每次在块中只能被同一个进程加数。
//我们再来看下使用 Lock是如何实现的
2. Lock

1

2

3

4

5

6

7

8

9

10

11

publicclassCounter {

 

  privateLock lock =newLock();

 privateintcount =0;

 

  publicintinc() {

      lock.lock();

        intnewCount = ++count;

     lock.unlock();

      returnnewCount;

    }

}


//从调用Lock方法之后lock的实例就被锁定,直道被调用unlock才解锁。

性能比较:

下面是在我电脑上跑出的结果:

Threads

1x
synch

1x
Lock

1x
AtomicInteger

2x
synch

2x
Lock

2x
AtomicInteger

1

1.797

2.175

0.947

3.246

4.111

1.703

2

8.685

4.134

1.889

13.144

4.901

1.949

4

7.942

3.040

1.735

13.182

4.960

1.945

8

7.648

3.011

1.894

13.287

4.979

1.951

16

8.017

2.974

1.735

13.040

4.573

1.950

32

7.908

2.958

1.777

13.059

4.845

1.958

64

7.853

2.972

1.878

13.316

5.004

1.954


从结果上看,当线程数越多时Lock的效率越高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值