Java 中lock和synchronized关键词的区别

来源:互联网 发布:p2p网贷数据 编辑:程序博客网 时间:2024/04/30 06:34

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的效率越高

0 0