Java多线程探究-Lock锁对象
2017-04-12 15:37
134 查看
Lock是JDK1.5后提供的对象锁
看一下Lock类的类图
Lock的使用
Lock对象必须手动加锁,和手动释放锁
synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?
如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁会有三种情况:
1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;
2)线程执行发生异常,此时JVM会让线程自动释放锁。
3)这个主要是在等待唤醒机制里面的wait()方法,//在等待的时候立即释放锁,方便其他的线程使用锁。而且被唤醒时,就在此处唤醒,
那么如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,试想一下,这多么影响程序执行效率。因此我们需要不论程序的代码块执行的如何最终都将锁对象进行释放,方便其他线程的执行。
看一下Lock类的类图
Lock的使用
class MyRunnable implements Runnable { private int ticket = 100; private Lock myLock = new ReentrantLock(); @Override public void run() { salseTicket(); } public void salseTicket() { while (true) { myLock.lock(); try { if (ticket > 0) { try { Thread.sleep(5); System.out.println("线程 " + Thread.currentThread().getName() + " sales " + ticket--); } catch (InterruptedException e) { e.printStackTrace(); } } else { break; } } catch (Exception e) { } finally { myLock.unlock(); } } } }
Lock对象必须手动加锁,和手动释放锁
synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?
如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁会有三种情况:
1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;
2)线程执行发生异常,此时JVM会让线程自动释放锁。
3)这个主要是在等待唤醒机制里面的wait()方法,//在等待的时候立即释放锁,方便其他的线程使用锁。而且被唤醒时,就在此处唤醒,
那么如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,试想一下,这多么影响程序执行效率。因此我们需要不论程序的代码块执行的如何最终都将锁对象进行释放,方便其他线程的执行。
相关文章推荐
- Java多线程----java 对象锁(synchronized/lock)
- Java多线程(八):锁对象Lock-同步问题更完美的处理方式
- java多线程:锁对象Lock-同步问题更完美的处理方式
- Java多线程总结(二):理解对象锁 & synchronized和Lock的区别
- 【我的Java笔记】多线程_使用Lock锁对象解决线程安全问题
- 黑马程序员——第十一天(Java面向对象-多线程一)
- java面向对象--多线程
- Java:使用synchronized和Lock对象获取对象锁
- Java多线程 同步 锁 条件对象
- 关于java当中的多线程设计, wait/notify机制 , synchronized与对象锁
- java多线程--Lock(锁)
- GOOD单例模式,多线程同时访问一个实例对象问题的处理,加lock
- Java多线程运行时,尽可能调用单例对象、工具类和静态方法,这样可以减少内存的占用量
- Java多线程之Lock的使用
- jni c本地代码回调java (多线程中,创建java对象时报空指针)未解决
- c# winform 多线程操作统一对象(lock)
- 当JNI遇到多线程--java对象如何被C++中的多个线程访问?
- Java:使用synchronized和Lock对象获取对象锁
- Java:使用synchronized和Lock对象获取对象锁 推荐
- Java 多线程同步问题的探究(三、Lock来了,大家都让开【2. Fair or Unfair? It is a question...】)