zoukankan      html  css  js  c++  java
  • 五、线程同步 Lock 锁

    一、线程同步的第三种方法

    Lock 锁:对需要上锁的地方上锁

    1) JDK1.5 后新增的功能

    2) 与 Synchronized 相比,Lock 可提供多种锁方案,更灵活

    3) Java.util.concurrent.locks 中的 Lock 是一个接口,它的实现 类是一个 Java 类,而不是作为语言的特性(关键字)来实现

    注意:如果同步代码有异常,要将 unLock()放到 finally 中

    二、步骤

    1) 创建 Lock 对象

    2) 调用 lock()方法上锁

    3) 调用 unlock()方法解锁

    三、Lock 与 synchronized 的区别

    1) Lock 是 显 示 锁 ( 手 动 开 启 和 关 闭 锁 , 别 忘 关 闭 锁),synchronized 是隐式锁

    2) Lock 只有代码块锁,synchronized 有代码块锁和方法锁

    3) 使用 Lock 锁,JVM 将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性(提供更多的子类)

    4) Lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它 将一直等待(即被阻止),直到该对象被释放。lock()方法会 对 Lock 实例对

    象进行加锁,因此所有对该对象调用 lock() 方法的线程都会被阻塞,直到该 Lock 对象的 unlock()方法被调用、

     1 public class CountRunnable implements Runnable{
     2     public static void main(String[] args) {
     3         CountRunnable cr=new CountRunnable();
     4         //代理类的对象
     5         Thread t1=new Thread(cr,"A");
     6         Thread t2=new Thread(cr,"B");
     7         Thread t3=new Thread(cr,"C");
     8 
     9         t1.start();
    10         t2.start();
    11         t3.start();
    12 
    13     }
    14     private int count=0;//默认值
    15     //创建一个Lock对象
    16     Lock lock = new ReentrantLock();
    17     @Override
    18     public  void run() {
    19         for (int i = 0; i < 10; i++) {
    20             //synchronized (this) {
    21             try {
    22                 lock.lock();//加锁
    23                 count++;
    24                 try {
    25                     Thread.sleep(300);
    26                 } catch (InterruptedException e) {
    27                     // TODO Auto-generated catch block
    28                     e.printStackTrace();
    29                 }
    30                 System.out.println(Thread.currentThread().getName() + "执行操作:count=" + count);
    31             }finally {  //防止出现异常,不进行解锁
    32                 //解锁
    33                 lock.unlock();
    34             }
    35         }
    36     }
    37 }

  • 相关阅读:
    LayoutComponent类,用于layout的组件类。 LayoutComponent保存的所有用于布局的数据。
    Button控件常用api
    基础容器的常用接口
    tolua.cast的实用方法
    cocos2dx+lua注册事件函数详解
    我所理解cocos2d-x 3.6 lua --使用Cocos Studio
    quick-cocos2d-x学习笔记—定时器
    quick cocos 的scheduler 定时器
    (1)制定开发计划
    (11)UI布局和分辨率适配
  • 原文地址:https://www.cnblogs.com/qiaoxin11/p/12720415.html
Copyright © 2011-2022 走看看