首页 > 其他分享 >线程 Lock 锁

线程 Lock 锁

时间:2022-09-30 06:33:05浏览次数:37  
标签:lock ReentrantLock 线程 Lock new public

线程 Lock 锁

JUC安全集合类型扩充

package com.gcbeen.thread;

import java.util.concurrent.CopyOnWriteArrayList;

// 测试JUC安全类型的集合
public class TestThreadJuc {

    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        for (int k = 0; k < 3; k++) {
            new Thread(() -> {
                for (int i = 0; i < 10000; i++) {
                    list.add(Thread.currentThread().getName());
                }
            }).start();
        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }

}

CopyOnWriteArrayList 部分源码

public class CopyOnWriteArrayList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    private static final long serialVersionUID = 8673264195747942595L;

    /** The lock protecting all mutators */
    final transient ReentrantLock lock = new ReentrantLock();

    /** The array, accessed only via getArray/setArray. */
    private transient volatile Object[] array;

Lock(锁)

从JDK 5.0开始, Java提供了更强大的线程同步机制一通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。

java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。

ReentrantLock 类实现了 Lock,它拥有与 synchronized 相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是 ReentrantLock, 可以显式加锁、释放锁。

class A{
    private final Reentrantlock lock = new Reen TrantLock();
    public void m(){
        lock.lock();
        try{
            // 保证线程安全的代码
        }
        finally{
            lock.unlock();    // 如果同步代码有异常,要将unlock()写入finally语句块
        } 
    }
} 

测试Lock锁

package com.gcbeen.thread;

import java.util.concurrent.locks.ReentrantLock;

// 测试Lock锁
public class TestThreadLock {

    public static void main(String[] args) {
        TestLock testLock = new TestLock();
        new Thread(testLock).start();
        new Thread(testLock).start();
        new Thread(testLock).start();
    }

}


class TestLock implements Runnable {
    int tickerNums = 10;
    // 定义Lock锁
    private final ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
        while (true) {
            // 加锁
            try {
                lock.lock();
                if (tickerNums <= 0) {
                    break;
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " : " + tickerNums--);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 解锁
                lock.unlock();
            }
        }
    }
}

// Thread-0 : 10
// Thread-0 : 9
// Thread-0 : 8
// Thread-0 : 7
// Thread-0 : 6
// Thread-0 : 5
// Thread-0 : 4
// Thread-0 : 3
// Thread-0 : 2
// Thread-0 : 1

// Process finished with exit code 0

synchroized 与 Lock 对比

  1. Lock是显式锁 (手动开启和关闭锁,别忘记关闭锁) synchronized是隐式锁, 出了作用域自动释放。

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

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

优先使用顺序:

Lock > 同步代码块 (已经进入了方法体,分配了相应资源 ) > )>)> 同步方法 (在方法体之外)

标签:lock,ReentrantLock,线程,Lock,new,public
From: https://www.cnblogs.com/gcbeen/p/16743655.html

相关文章

  • 线程同步
    线程同步介绍多个线程操作同一个资源线程同步现实生活中我们会遇到“同—个资源,多个人都想使用”的问题,比如食堂排队打饭,每个人都想吃饭,最天然的解決办法就是:排队,一个......
  • 线程 synchroized
    线程synchroizedsynchroized同步方法由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提岀一套机制,这套机制就是synchronized关......
  • 线程的实现-线程的创建(三种方式)
    线程实现线程的创建(三种方式)1.继承Thread类(重要)自定义线程类继承Thread类;重写run()方法,编写线程执行体;创建线程对象,调用start()方法启动线程。packagecom.gcbee......
  • 委托/事件/线程传参简单理解
    写了很多代码,但几乎都没写过委托/事件/线程传参方面应用的代码因此自己总很容易理解后又遗忘今天又重温了一下因此以最简单的方式的代码方式写下来帮助理解1.线程传参[简单......
  • swoole基础进阶之进程篇1 进程、线程、协程
    视频https://www.bilibili.com/video/BV1oJ411U7bc/或https://edu.51cto.com/center/course/lesson/index?id=412750......
  • 线程简介
    线程简介一、多任务现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本质上我们的大脑在同一时间依旧只做了一件事情。二、多线程原来是一条车道,车......
  • 多线程
    packagecom.bkc.bpmp.modules.external.service;importjava.util.concurrent.*;importjava.util.Date;importjava.util.List;importjava.util.ArrayList;/***Java线程......
  • python 线程
    1.1线程的背景知识importthreading#导入线程相关的模块t=threading.current_thread()#返回当前线程print(t)#主线程执行print(t.getName())#线程名字print......
  • python5种线程锁
    # 线程安全线程安全是多线程或多进程编程中的一个概念,在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会......
  • python的多线程
    一、线程的概念线程是CPU分配资源的基本单位。当一程序开始运行,这个程序就变成了一个进程,而一个进程相当于一个或者多个线程。当没有多线程编程时,一个进程相当于一个主线程......