• 一起Talk Android吧(第三百六十六回:多线程之LOCK锁)


    各位看官们,大家好,上一回中咱们说的是Android中多线程之同步方法的例子,这一回中咱们介绍的例子是多线程之LOCK锁。闲话休提,言归正转。让我们一起Talk Android吧!

    使用方法

    看官们,我们在前面章回中介绍了同步块和同步方法相关的技术,其实在很早之前我就介绍过这方面的知识,只是没有像现在一样分的这么细。大家可以点击这里查看以前的内容。

    本章回中我们再介绍一种技术:LOCK锁,它和同步块、同步方法一样,主要用来解决多线程访问共享资源不一致的问题。接下来我们介绍如何使用这种技术。

    • 定义ReentrantLock锁对象lockObj
    • 在访问共享资源前获取锁:lockOjb.lock()
    • 在访问共享资源后释放锁:lockOjb.unlock()

    从操作步骤上可以看出来,LOCK锁的原理也是加锁,而且可以手动加锁和解锁,操作起来相对灵活一些。

    示例演示

    光说不练不是我们的风格,接下来我们通过具体的代码来演示如何使用LOCK锁.

    public class ThreadLock {
        public static void main(String[] args) {
            // 使用LOCK锁来同步线程
            class ProducerAndCustomer {
                //临界资源或者叫共享资源
                private int criticalResource;
                //定义锁
                private Lock threadLock;
                public ProducerAndCustomer() {
                    criticalResource = 0;
                    threadLock = new ReentrantLock();
                }
                public void produce() {
                    //操作共享资源前加锁
                    threadLock.lock();LOCK锁来同步线程。LOCK锁来同步线程。
                    criticalResource += 1;
                    System.out.println("produce finished CriticalResource : "+criticalResource);
                    //操作共享资源后去锁
                    threadLock.unlock();
                }
                public void consume() {
                    //操作共享资源前加锁
                    threadLock.lock();
                    System.out.println("consume finished CriticalResource : "+criticalResource);
                    criticalResource -= 1;
                    //操作共享资源后去锁
                    threadLock.unlock();
                }
            }
    
           ProducerAndCustomer obj = new ProducerAndCustomer();
    
            new Thread(()->{
                for (int i=0; i<3; i++) {
                    obj.produce();
                }},"Produce: ").start();
    
            new Thread(()->{
                for (int i=0; i<3; i++) {
                    obj.consume();
                }},"Consume: ").start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    上面的程序和上一章回的程序类似,还是生产者与消费者的问题,不同的地方是模拟生产和消费操作的方法使用LOCK锁来同步线程。编译并且运行上面的程序可以得到以下结果:

    produce finished CriticalResource : 1
    produce finished CriticalResource : 2
    produce finished CriticalResource : 3
    consume finished CriticalResource : 3
    consume finished CriticalResource : 2
    consume finished CriticalResource : 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    从程序的运行结果中可以看出来,生产者和消费者操作商品的数量是一致的,这说明同步方法可以有效地解决多线程访问共享资源的问题。

    对比总结

    到目前为止我们介绍了三种同步线程的方法,它们背后的原理都是加锁,不同之处在于同步块和同步方法是指定锁变量后自动加锁和解锁,因此使用方便,而LOCK锁需要手动加锁和解锁,虽然使用不方便,但是可以灵活控制锁。

    看官们,关于Android中多线程之LOCK锁的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

  • 相关阅读:
    科研工作学习中常用的录制动图软件——screenToGif
    K8S排水错误汇总(忽略DaemonSet管理Pod、Mysql集群排水报错、Mongo集群排水报错)
    【技术分享】配置用户通过Telnet登录设备的身份认证
    Linux网络:HTTP 与 HTTPS
    多篇论文介绍-DSConv-原文
    elasticsearch + java实现复杂查询
    【二】2D测量 Metrology——align_metrology_model()算子
    排序算法-快速排序
    r语言绘制动态统计图:绘制世界各国的人均GDP,出生时的期望寿命和人口气泡图动画动态gif图
    力扣:153. 寻找旋转排序数组中的最小值(Python3)
  • 原文地址:https://blog.csdn.net/talk_8/article/details/126026529