面试题-简述synchronized和java.util.concurrent.locks.Lock的异同 ?
来源:互联网 发布:java如何输入一个数 编辑:程序博客网 时间:2024/05/29 13:56
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。
举例说明(对下面的题用lock进行了改写):
import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ThreadTest { /** * @param args */ private int j; private Lock lock = new ReentrantLock(); public static void main(String[] args) { // TODO Auto-generated method stub ThreadTest tt = new ThreadTest(); for(int i=0;i<2;i++) { new Thread(tt.new Adder()).start(); new Thread(tt.new Subtractor()).start(); } } private class Subtractor implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(true) { /*synchronized (ThreadTest.this) { System.out.println("j--=" + j--); //这里抛异常了,锁能释放吗? }*/ lock.lock(); try { System.out.println("j--=" + j--); }finally { lock.unlock(); } } } } private class Adder implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(true) { /*synchronized (ThreadTest.this) { System.out.println("j++=" + j++); }*/ lock.lock(); try { System.out.println("j++=" + j++); }finally { lock.unlock(); } } } }}
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。
举例说明(对下面的题用lock进行了改写):
import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ThreadTest { /** * @param args */ private int j; private Lock lock = new ReentrantLock(); public static void main(String[] args) { // TODO Auto-generated method stub ThreadTest tt = new ThreadTest(); for(int i=0;i<2;i++) { new Thread(tt.new Adder()).start(); new Thread(tt.new Subtractor()).start(); } } private class Subtractor implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(true) { /*synchronized (ThreadTest.this) { System.out.println("j--=" + j--); //这里抛异常了,锁能释放吗? }*/ lock.lock(); try { System.out.println("j--=" + j--); }finally { lock.unlock(); } } } } private class Adder implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(true) { /*synchronized (ThreadTest.this) { System.out.println("j++=" + j++); }*/ lock.lock(); try { System.out.println("j++=" + j++); }finally { lock.unlock(); } } } }}
阅读全文
0 0
- 面试题-简述synchronized和java.util.concurrent.locks.Lock的异同 ?
- 面试题-简述synchronized和java.util.concurrent.locks.Lock的异同 ?
- 简述synchronized和java.util.concurrent.locks.Lock的异同?
- 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
- 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
- 简述synchronized和java.util.concurrent.locks.Lock的异同_JAVA
- synchronized和java.util.concurrent.locks.Lock的异同
- synchronized 和 java.util.concurrent.locks.Lock 的异同?
- synchronized和java.util.concurrent.locks.Lock的异同
- synchronized 和java.util.concurrent.locks.Lock 的异同
- synchronized和java.util.concurrent.locks.Lock的异同
- synchronized和java.util.concurrent.locks.Lock的异同
- synchronized 和java.util.concurrent.locks.Lock 的异同
- synchronized和java.util.concurrent.locks.Lock的异同
- synchronized和java.util.concurrent.locks.Lock的异同
- synchronized 和java.util.concurrent.locks.Lock 的异同
- synchronized和java.util.concurrent.locks.Lock的异同
- synchronized 和java.util.concurrent.locks.Lock的异同
- GetWindowRect和GetClientRect的区别详解
- 磁盘已经包含最大分区数
- Unity官方手册翻译之旅---Offline documentation
- RMS调度详解
- 检测字符串是否包含手机号,防止用户名包含手机号
- 面试题-简述synchronized和java.util.concurrent.locks.Lock的异同 ?
- C++概述1
- python报错——HealthGateway cannot be converted to PyQt5.QtCore.QObject in this context
- 一台电脑使用多个tomcat
- UML工具大全(下)
- 将tomcat服务注册到service中,使用service tomcat start启动
- K线三方库__ZXKline
- 第四章 决策树——机器学习(周志华)课后答案
- apk打包流程及各个阶段使用的工具