Jdk1.5以后,Doug Lea大神添加了新的多线程的包,在java.util.concurrent.locks下,有一组实现线程同步的接口Lock和类ReentrantLock.ReentrantLock也是Lock接口的唯一实现类.
Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有的加锁和解锁方法都是显示的.
public interface Lock {
// 用来获取锁,如果锁已经被其他线程获取,则一直等待,直到获取到锁
void lock();
// 该方法获取锁时,可以响应中断,比如现在有两个线程,一个已经获取到了锁,另一个线程调用这个方法正在等待锁,但是此刻又不想让这个线程一直在这死等,可以通过调用线程的Thread.interrupted()方法,来中断线程的等待过程
void lockInterruptibly() throws InterruptedException;
// tryLock方法会返回布尔值,该方法会尝试着获取锁,如果获取到锁,就返回true,如果没有获取到锁,就返回false,但是该方法会立刻返回,而不会一直等待
boolean tryLock();
// 这个方法和上面的tryLock差不多是一样的,只是会尝试指定的时间,如果在指定的时间内拿到了锁,则会返回true,如果在指定的时间内没有拿到锁,则会返回false
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 释放锁
void unlock();
// 实现线程通信,相当于wait和notify
Condition newCondition();
}
ReentrantLock实现了Lock接口,并提供了和synchronized相同的互斥性和内存可见性,ReentrantLock也提供了可重入的加锁语义.使用Lock锁有标准的使用格式:
Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {// 必须使用try,最后在finally里面释放锁
l.unlock();
}
下面给出自己的demo:
package com.springcloud.server.springserver.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockDemo {
// new一个锁对象,注意此处必须声明成类对象,保持只有一把锁,ReentrantLock是Lock的唯一实现类
Lock lock = new ReentrantLock();
public void readFile(String fileMessage){
lock.lock();// 上锁
try{
System.out.println(Thread.currentThread().getName()+"得到了锁,正在读取文件……");
for(int i=0; i<fileMessage.length(); i++){
System.out.print(fileMessage.charAt(i));
}
System.out.println();
System.out.println("文件读取完毕!");
}finally{
lock.unlock();
System.out.println(Thread.currentThread().getName()+"释放了锁!");
System.out.println("------------------------");
}
}
public void demo(final String fileMessage){
// 创建数量可变的线程池
ExecutorService service = Executors.newCachedThreadPool();
// 提交5个任务
for(int i=0; i<5; i++){
service.execute(new Runnable() {
@Override
public void run() {
readFile(fileMessage);
}
});
}
// 释放线程池中的线程
service.shutdown();
}
public static void main(String[] args) {
LockDemo lockDemo = new LockDemo();
lockDemo.demo("消息");
}
}
输出结果:
"D:\JAVA Develop\jdk1.8\jdk8\bin\java.exe" "-javaagent:E:\idea\IntelliJ IDEA 2018.1.5\lib\idea_rt.jar=55424:E:\idea\IntelliJ IDEA 2018.1.5\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA Develop\jdk1.8\jdk8\jre\lib\charsets.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\deploy.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\access-bridge-64.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\cldrdata.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\dnsns.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\jaccess.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\jfxrt.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\localedata.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\nashorn.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\sunec.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\sunjce_provider.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\sunmscapi.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\sunpkcs11.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\ext\zipfs.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\javaws.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\jce.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\jfr.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\jfxswt.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\jsse.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\management-agent.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\plugin.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\resources.jar;D:\JAVA Develop\jdk1.8\jdk8\jre\lib\rt.jar;E:\springcloud\spring-eureka\target\test-classes;E:\springcloud\spring-eureka\target\classes;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-starter-netflix-eureka-server\2.0.1.RELEASE\spring-cloud-starter-netflix-eureka-server-2.0.1.RELEASE.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-starter\2.0.1.RELEASE\spring-cloud-starter-2.0.1.RELEASE.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-context\2.0.1.RELEASE\spring-cloud-context-2.0.1.RELEASE.jar;E:\repository\repository_sshold\org\springframework\security\spring-security-crypto\5.0.8.RELEASE\spring-security-crypto-5.0.8.RELEASE.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-commons\2.0.1.RELEASE\spring-cloud-commons-2.0.1.RELEASE.jar;E:\repository\repository_sshold\org\springframework\security\spring-security-rsa\1.0.5.RELEASE\spring-security-rsa-1.0.5.RELEASE.jar;E:\repository\repository_sshold\org\bouncycastle\bcpkix-jdk15on\1.56\bcpkix-jdk15on-1.56.jar;E:\repository\repository_sshold\org\bouncycastle\bcprov-jdk15on\1.56\bcprov-jdk15on-1.56.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-netflix-eureka-server\2.0.1.RELEASE\spring-cloud-netflix-eureka-server-2.0.1.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-starter-web\2.0.5.RELEASE\spring-boot-starter-web-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-starter-json\2.0.5.RELEASE\spring-boot-starter-json-2.0.5.RELEASE.jar;E:\repository\repository_sshold\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.6\jackson-datatype-jdk8-2.9.6.jar;E:\repository\repository_sshold\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.6\jackson-datatype-jsr310-2.9.6.jar;E:\repository\repository_sshold\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.6\jackson-module-parameter-names-2.9.6.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-starter-tomcat\2.0.5.RELEASE\spring-boot-starter-tomcat-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\apache\tomcat\embed\tomcat-embed-core\8.5.34\tomcat-embed-core-8.5.34.jar;E:\repository\repository_sshold\org\apache\tomcat\embed\tomcat-embed-el\8.5.34\tomcat-embed-el-8.5.34.jar;E:\repository\repository_sshold\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.34\tomcat-embed-websocket-8.5.34.jar;E:\repository\repository_sshold\org\hibernate\validator\hibernate-validator\6.0.12.Final\hibernate-validator-6.0.12.Final.jar;E:\repository\repository_sshold\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;E:\repository\repository_sshold\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;E:\repository\repository_sshold\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;E:\repository\repository_sshold\org\springframework\spring-web\5.0.9.RELEASE\spring-web-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\springframework\spring-beans\5.0.9.RELEASE\spring-beans-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\springframework\spring-webmvc\5.0.9.RELEASE\spring-webmvc-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\springframework\spring-aop\5.0.9.RELEASE\spring-aop-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\springframework\spring-expression\5.0.9.RELEASE\spring-expression-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-starter-actuator\2.0.5.RELEASE\spring-boot-starter-actuator-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-actuator-autoconfigure\2.0.5.RELEASE\spring-boot-actuator-autoconfigure-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-actuator\2.0.5.RELEASE\spring-boot-actuator-2.0.5.RELEASE.jar;E:\repository\repository_sshold\io\micrometer\micrometer-core\1.0.6\micrometer-core-1.0.6.jar;E:\repository\repository_sshold\org\hdrhistogram\HdrHistogram\2.1.10\HdrHistogram-2.1.10.jar;E:\repository\repository_sshold\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-starter-freemarker\2.0.5.RELEASE\spring-boot-starter-freemarker-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\freemarker\freemarker\2.3.28\freemarker-2.3.28.jar;E:\repository\repository_sshold\org\springframework\spring-context-support\5.0.9.RELEASE\spring-context-support-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-netflix-core\2.0.1.RELEASE\spring-cloud-netflix-core-2.0.1.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-starter-aop\2.0.5.RELEASE\spring-boot-starter-aop-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\aspectj\aspectjweaver\1.8.13\aspectjweaver-1.8.13.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-netflix-eureka-client\2.0.1.RELEASE\spring-cloud-netflix-eureka-client-2.0.1.RELEASE.jar;E:\repository\repository_sshold\com\netflix\eureka\eureka-client\1.9.3\eureka-client-1.9.3.jar;E:\repository\repository_sshold\org\codehaus\jettison\jettison\1.3.7\jettison-1.3.7.jar;E:\repository\repository_sshold\stax\stax-api\1.0.1\stax-api-1.0.1.jar;E:\repository\repository_sshold\com\netflix\netflix-commons\netflix-eventbus\0.3.0\netflix-eventbus-0.3.0.jar;E:\repository\repository_sshold\com\netflix\netflix-commons\netflix-infix\0.3.0\netflix-infix-0.3.0.jar;E:\repository\repository_sshold\commons-jxpath\commons-jxpath\1.3\commons-jxpath-1.3.jar;E:\repository\repository_sshold\joda-time\joda-time\2.9.9\joda-time-2.9.9.jar;E:\repository\repository_sshold\org\antlr\antlr-runtime\3.4\antlr-runtime-3.4.jar;E:\repository\repository_sshold\org\antlr\stringtemplate\3.2.1\stringtemplate-3.2.1.jar;E:\repository\repository_sshold\antlr\antlr\2.7.7\antlr-2.7.7.jar;E:\repository\repository_sshold\com\google\code\gson\gson\2.8.5\gson-2.8.5.jar;E:\repository\repository_sshold\org\apache\commons\commons-math\2.2\commons-math-2.2.jar;E:\repository\repository_sshold\javax\ws\rs\jsr311-api\1.1.1\jsr311-api-1.1.1.jar;E:\repository\repository_sshold\com\netflix\servo\servo-core\0.12.21\servo-core-0.12.21.jar;E:\repository\repository_sshold\com\sun\jersey\jersey-core\1.19.1\jersey-core-1.19.1.jar;E:\repository\repository_sshold\com\sun\jersey\jersey-client\1.19.1\jersey-client-1.19.1.jar;E:\repository\repository_sshold\com\sun\jersey\contribs\jersey-apache-client4\1.19.1\jersey-apache-client4-1.19.1.jar;E:\repository\repository_sshold\org\apache\httpcomponents\httpclient\4.5.6\httpclient-4.5.6.jar;E:\repository\repository_sshold\org\apache\httpcomponents\httpcore\4.4.10\httpcore-4.4.10.jar;E:\repository\repository_sshold\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;E:\repository\repository_sshold\com\google\inject\guice\4.1.0\guice-4.1.0.jar;E:\repository\repository_sshold\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;E:\repository\repository_sshold\com\github\vlsi\compactmap\compactmap\1.2.1\compactmap-1.2.1.jar;E:\repository\repository_sshold\com\github\andrewoma\dexx\dexx-collections\0.2\dexx-collections-0.2.jar;E:\repository\repository_sshold\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;E:\repository\repository_sshold\com\fasterxml\jackson\core\jackson-core\2.9.6\jackson-core-2.9.6.jar;E:\repository\repository_sshold\com\fasterxml\jackson\core\jackson-databind\2.9.6\jackson-databind-2.9.6.jar;E:\repository\repository_sshold\com\sun\jersey\jersey-servlet\1.19.1\jersey-servlet-1.19.1.jar;E:\repository\repository_sshold\com\sun\jersey\jersey-server\1.19.1\jersey-server-1.19.1.jar;E:\repository\repository_sshold\com\netflix\eureka\eureka-core\1.9.3\eureka-core-1.9.3.jar;E:\repository\repository_sshold\org\codehaus\woodstox\woodstox-core-asl\4.4.1\woodstox-core-asl-4.4.1.jar;E:\repository\repository_sshold\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar;E:\repository\repository_sshold\com\netflix\archaius\archaius-core\0.7.6\archaius-core-0.7.6.jar;E:\repository\repository_sshold\com\google\code\findbugs\jsr305\3.0.1\jsr305-3.0.1.jar;E:\repository\repository_sshold\com\google\guava\guava\16.0\guava-16.0.jar;E:\repository\repository_sshold\javax\inject\javax.inject\1\javax.inject-1.jar;E:\repository\repository_sshold\com\fasterxml\jackson\dataformat\jackson-dataformat-xml\2.9.6\jackson-dataformat-xml-2.9.6.jar;E:\repository\repository_sshold\com\fasterxml\jackson\module\jackson-module-jaxb-annotations\2.9.6\jackson-module-jaxb-annotations-2.9.6.jar;E:\repository\repository_sshold\org\codehaus\woodstox\stax2-api\3.1.4\stax2-api-3.1.4.jar;E:\repository\repository_sshold\com\fasterxml\woodstox\woodstox-core\5.0.3\woodstox-core-5.0.3.jar;E:\repository\repository_sshold\com\thoughtworks\xstream\xstream\1.4.10\xstream-1.4.10.jar;E:\repository\repository_sshold\xmlpull\xmlpull\1.1.3.1\xmlpull-1.1.3.1.jar;E:\repository\repository_sshold\xpp3\xpp3_min\1.1.4c\xpp3_min-1.1.4c.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-starter-netflix-archaius\2.0.1.RELEASE\spring-cloud-starter-netflix-archaius-2.0.1.RELEASE.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-netflix-ribbon\2.0.1.RELEASE\spring-cloud-netflix-ribbon-2.0.1.RELEASE.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-netflix-archaius\2.0.1.RELEASE\spring-cloud-netflix-archaius-2.0.1.RELEASE.jar;E:\repository\repository_sshold\commons-configuration\commons-configuration\1.8\commons-configuration-1.8.jar;E:\repository\repository_sshold\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;E:\repository\repository_sshold\org\springframework\cloud\spring-cloud-starter-netflix-ribbon\2.0.1.RELEASE\spring-cloud-starter-netflix-ribbon-2.0.1.RELEASE.jar;E:\repository\repository_sshold\com\netflix\ribbon\ribbon\2.2.5\ribbon-2.2.5.jar;E:\repository\repository_sshold\com\netflix\ribbon\ribbon-transport\2.2.5\ribbon-transport-2.2.5.jar;E:\repository\repository_sshold\io\reactivex\rxnetty-contexts\0.4.9\rxnetty-contexts-0.4.9.jar;E:\repository\repository_sshold\io\reactivex\rxnetty-servo\0.4.9\rxnetty-servo-0.4.9.jar;E:\repository\repository_sshold\com\netflix\hystrix\hystrix-core\1.5.12\hystrix-core-1.5.12.jar;E:\repository\repository_sshold\io\reactivex\rxnetty\0.4.9\rxnetty-0.4.9.jar;E:\repository\repository_sshold\io\netty\netty-codec-http\4.1.29.Final\netty-codec-http-4.1.29.Final.jar;E:\repository\repository_sshold\io\netty\netty-codec\4.1.29.Final\netty-codec-4.1.29.Final.jar;E:\repository\repository_sshold\io\netty\netty-transport-native-epoll\4.1.29.Final\netty-transport-native-epoll-4.1.29.Final.jar;E:\repository\repository_sshold\io\netty\netty-common\4.1.29.Final\netty-common-4.1.29.Final.jar;E:\repository\repository_sshold\io\netty\netty-buffer\4.1.29.Final\netty-buffer-4.1.29.Final.jar;E:\repository\repository_sshold\io\netty\netty-transport-native-unix-common\4.1.29.Final\netty-transport-native-unix-common-4.1.29.Final.jar;E:\repository\repository_sshold\io\netty\netty-transport\4.1.29.Final\netty-transport-4.1.29.Final.jar;E:\repository\repository_sshold\io\netty\netty-resolver\4.1.29.Final\netty-resolver-4.1.29.Final.jar;E:\repository\repository_sshold\com\netflix\ribbon\ribbon-core\2.2.5\ribbon-core-2.2.5.jar;E:\repository\repository_sshold\com\netflix\ribbon\ribbon-httpclient\2.2.5\ribbon-httpclient-2.2.5.jar;E:\repository\repository_sshold\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;E:\repository\repository_sshold\com\netflix\netflix-commons\netflix-commons-util\0.3.0\netflix-commons-util-0.3.0.jar;E:\repository\repository_sshold\com\netflix\ribbon\ribbon-loadbalancer\2.2.5\ribbon-loadbalancer-2.2.5.jar;E:\repository\repository_sshold\com\netflix\netflix-commons\netflix-statistics\0.1.1\netflix-statistics-0.1.1.jar;E:\repository\repository_sshold\io\reactivex\rxjava\1.3.8\rxjava-1.3.8.jar;E:\repository\repository_sshold\com\netflix\ribbon\ribbon-eureka\2.2.5\ribbon-eureka-2.2.5.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-starter-test\2.0.5.RELEASE\spring-boot-starter-test-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-starter\2.0.5.RELEASE\spring-boot-starter-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot\2.0.5.RELEASE\spring-boot-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\springframework\spring-context\5.0.9.RELEASE\spring-context-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-autoconfigure\2.0.5.RELEASE\spring-boot-autoconfigure-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-starter-logging\2.0.5.RELEASE\spring-boot-starter-logging-2.0.5.RELEASE.jar;E:\repository\repository_sshold\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\repository\repository_sshold\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\repository\repository_sshold\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;E:\repository\repository_sshold\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;E:\repository\repository_sshold\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;E:\repository\repository_sshold\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;E:\repository\repository_sshold\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-test\2.0.5.RELEASE\spring-boot-test-2.0.5.RELEASE.jar;E:\repository\repository_sshold\org\springframework\boot\spring-boot-test-autoconfigure\2.0.5.RELEASE\spring-boot-test-autoconfigure-2.0.5.RELEASE.jar;E:\repository\repository_sshold\com\jayway\jsonpath\json-path\2.4.0\json-path-2.4.0.jar;E:\repository\repository_sshold\net\minidev\json-smart\2.3\json-smart-2.3.jar;E:\repository\repository_sshold\net\minidev\accessors-smart\1.2\accessors-smart-1.2.jar;E:\repository\repository_sshold\org\ow2\asm\asm\5.0.4\asm-5.0.4.jar;E:\repository\repository_sshold\junit\junit\4.12\junit-4.12.jar;E:\repository\repository_sshold\org\assertj\assertj-core\3.9.1\assertj-core-3.9.1.jar;E:\repository\repository_sshold\org\mockito\mockito-core\2.15.0\mockito-core-2.15.0.jar;E:\repository\repository_sshold\net\bytebuddy\byte-buddy\1.7.11\byte-buddy-1.7.11.jar;E:\repository\repository_sshold\net\bytebuddy\byte-buddy-agent\1.7.11\byte-buddy-agent-1.7.11.jar;E:\repository\repository_sshold\org\objenesis\objenesis\2.6\objenesis-2.6.jar;E:\repository\repository_sshold\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\repository\repository_sshold\org\hamcrest\hamcrest-library\1.3\hamcrest-library-1.3.jar;E:\repository\repository_sshold\org\skyscreamer\jsonassert\1.5.0\jsonassert-1.5.0.jar;E:\repository\repository_sshold\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;E:\repository\repository_sshold\org\springframework\spring-core\5.0.9.RELEASE\spring-core-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\springframework\spring-jcl\5.0.9.RELEASE\spring-jcl-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\springframework\spring-test\5.0.9.RELEASE\spring-test-5.0.9.RELEASE.jar;E:\repository\repository_sshold\org\xmlunit\xmlunit-core\2.5.1\xmlunit-core-2.5.1.jar;E:\repository\repository_sshold\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;E:\repository\repository_sshold\org\slf4j\slf4j-log4j12\1.7.25\slf4j-log4j12-1.7.25.jar;E:\repository\repository_sshold\log4j\log4j\1.2.17\log4j-1.2.17.jar" com.springcloud.server.springserver.thread.LockDemo
pool-1-thread-1得到了锁,正在读取文件……
消息
文件读取完毕!
pool-1-thread-1释放了锁!
------------------------
pool-1-thread-4得到了锁,正在读取文件……
消息
文件读取完毕!
pool-1-thread-4释放了锁!
------------------------
pool-1-thread-5得到了锁,正在读取文件……
消息
文件读取完毕!
pool-1-thread-5释放了锁!
------------------------
pool-1-thread-2得到了锁,正在读取文件……
消息
文件读取完毕!
pool-1-thread-2释放了锁!
------------------------
pool-1-thread-3得到了锁,正在读取文件……
消息
文件读取完毕!
pool-1-thread-3释放了锁!
------------------------
ReentrantLock在加锁语义上和内置的synchronized锁相同,此外它还提供了一些其它的功能,包括定时的锁等待、可中断的锁等待、公平性以及实现非块结构的加锁.性能的话稍稍优于内置锁.
与显示锁相比内置锁仍然具有很大的优势.内置锁为许多开发人员所熟悉,并且简洁紧凑.ReentrantLock的危险性比同步机制要高,如果忘记在finally块中调用unlock,代码表面可以运行,但是已经埋下了一颗定时炸弹.只有当内置锁不满足需求的时候,才考虑使用ReentrantLock.