今天本来是学习lock对象的,刚才想到多线程数量的问题,因此验证了一下,现在来记录下lock对象的学习。Lock对象是Java提供的比synchronized更为灵活,功能更为强大的锁,今天先学习一个简单的例子来说明lock锁的使用。ReentrantLock对象是lock的具体类,其作用是可以给特定的代码段加锁来支持多线程的同步功能。
共享类:
package com.lenovo.plm.dms.p14; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Service { private Lock lock = new ReentrantLock(); public void serviceA(){ lock.lock(); for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName() + " for serviceA" + i +" at the time: "+System.currentTimeMillis()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } lock.unlock(); } public void serviceB(){ lock.lock(); for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName() + " for serviceB" + i +" at the time: "+System.currentTimeMillis()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } lock.unlock(); } }
package com.lenovo.plm.dms.p14; public class MyThreadA extends Thread{ private Service service; public MyThreadA(Service service){ this.service = service; } @Override public void run() { // TODO Auto-generated method stub super.run(); service.serviceA(); } }
线程类B:
package com.lenovo.plm.dms.p14; public class MyThreadB extends Thread{ private Service service; public MyThreadB(Service service){ this.service = service; } @Override public void run() { // TODO Auto-generated method stub super.run(); service.serviceB(); } }
执行类:
package com.lenovo.plm.dms.p14; public class Main { public static void main(String[] args) { Service service = new Service(); MyThreadA t1 = new MyThreadA(service); t1.start(); MyThreadB t2 = new MyThreadB(service); t2.start(); } }
Thread-0 for serviceA0 at the time: 1456141744196
Thread-0 for serviceA1 at the time: 1456141745210
Thread-0 for serviceA2 at the time: 1456141746225
Thread-0 for serviceA3 at the time: 1456141747240
Thread-0 for serviceA4 at the time: 1456141748255
Thread-1 for serviceB0 at the time: 1456141749262
Thread-1 for serviceB1 at the time: 1456141750277
Thread-1 for serviceB2 at the time: 1456141751292
Thread-1 for serviceB3 at the time: 1456141752299
Thread-1 for serviceB4 at the time: 1456141753314
可以看出这个lock代码段中的代码都是同步执行的,而且一个类中有两段被lock加锁的代码,两个线程来调用的时候是互斥的。其作用和synchronized差不多。还有更好玩的功能再下次来记录。
另外,这个Lock可以在一个类中创建两个,那表示两个锁。这两个锁是不互斥的。
package com.lenovo.plm.dms.p14; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Service { private Lock lock = new ReentrantLock(); private Lock lock1 = new ReentrantLock(); public void serviceA(){ lock.lock(); for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName() + " for serviceA" + i +" at the time: "+System.nanoTime()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } lock.unlock(); } public void serviceB(){ lock1.lock(); for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName() + " for serviceB" + i +" at the time: "+System.nanoTime()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } lock1.unlock(); } }
Thread-0 for serviceA0 at the time: 13563172925425
Thread-1 for serviceB0 at the time: 13563173792462
Thread-1 for serviceB1 at the time: 13564183972447
Thread-0 for serviceA1 at the time: 13564184079990
Thread-0 for serviceA2 at the time: 13565202499725
Thread-1 for serviceB2 at the time: 13565203119993
Thread-0 for serviceA3 at the time: 13566217150104
Thread-1 for serviceB3 at the time: 13566217381254
Thread-0 for serviceA4 at the time: 13567230966020
Thread-1 for serviceB4 at the time: 13567231148085
Thread-0 for serviceA5 at the time: 13568245225496
Thread-1 for serviceB5 at the time: 13568245403098
Thread-1 for serviceB6 at the time: 13569259249359
Thread-0 for serviceA6 at the time: 13569260112380
Thread-1 for serviceB7 at the time: 13570275512435
Thread-0 for serviceA7 at the time: 13570275867639
Thread-1 for serviceB8 at the time: 13571290609049
Thread-0 for serviceA8 at the time: 13571290906689
Thread-0 for serviceA9 at the time: 13572303837273
Thread-1 for serviceB9 at the time: 13572304199617
Thread-0 for serviceA10 at the time: 13573319750054
Thread-1 for serviceB10 at the time: 13573320099010
Thread-0 for serviceA11 at the time: 13574334486556
Thread-1 for serviceB11 at the time: 13574334676206
Thread-0 for serviceA12 at the time: 13575349161031
Thread-1 for serviceB12 at the time: 13575349333724
Thread-0 for serviceA13 at the time: 13576364402672
Thread-1 for serviceB13 at the time: 13576364504860
Thread-0 for serviceA14 at the time: 13577379099013
Thread-1 for serviceB14 at the time: 13577379278846
Thread-0 for serviceA15 at the time: 13578394283090
Thread-1 for serviceB15 at the time: 13578394400896
Thread-0 for serviceA16 at the time: 13579408411372
Thread-1 for serviceB16 at the time: 13579408543012
Thread-0 for serviceA17 at the time: 13580424221964
Thread-1 for serviceB17 at the time: 13580424419201
Thread-1 for serviceB18 at the time: 13581438904026
Thread-0 for serviceA18 at the time: 13581442124066
Thread-1 for serviceB19 at the time: 13582454761919
Thread-0 for serviceA19 at the time: 13582454761919
Thread-1 for serviceB20 at the time: 13583469173561
Thread-0 for serviceA20 at the time: 13583469362319
Thread-1 for serviceB21 at the time: 13584483877042
Thread-0 for serviceA21 at the time: 13584483937730
Thread-1 for serviceB22 at the time: 13585499216409
Thread-0 for serviceA22 at the time: 13585499689865
Thread-1 for serviceB23 at the time: 13586514341136
Thread-0 for serviceA23 at the time: 13586514423690
在i=19的时候,两个线程是同时执行的。