首页 > 其他分享 >什么是锁?

什么是锁?

时间:2024-06-06 22:02:21浏览次数:15  
标签:Thread void System public static 方法 什么

目录

synchronized

特性:可重入,可见性

缺点:效率比较低,不够灵活,不可中断,无法感知获取锁

ReentrantLock:synchronized的增强版

特性:效率较高,灵活,可感知获取锁,可公平可非公平,可中断

缺点:需在finally释放锁

ReadWriteLock

特性:效率较高,灵活,可感知获取锁,读写分离控制(读多写少),读读并行,读写串行,写写串行

缺点:需在finally释放锁


生活中,我们在门上可以见到锁,在手机上可以见到锁,在电脑上,汽车上,保险柜上......等等,可见锁在我们生活中是一个随处可件的物品,但我们今天要讲的是,java中的锁。本篇文章仅博主个人观点,仅供参考,共同进步,感谢博友支持。

什么是锁?
将某种资源私有化的一种物品,没错java里面的锁也是这种特性,它可以让某个方法,某个变量或某个通道,在某个时刻下只能被一个线程占用。只有当这个锁释放了,另外的线程才可以使用。例子:上厕所,一个同事上厕所把门锁上,这个时候厕所就被上锁了,别人要想进去,只能等这位同事释放锁后出来,其他同事才可进入。这个厕所可以看成是临界区,同事就是线程。

临界区?
多个线程共享同一个资源的情况,为了防止出现数据不一致情况的发生,人们引入了临界区的概念。临界区是一个用来访问共享资源的代码块,同一时间内只运行一个线程进入。

有几种锁?
java体系中有几种锁呢?
synchronized(不公平)
ReentrantLock 重入锁 (可公平可不公平)
ReadWriteLock 读写锁(不公平)
公平?不公平
公平锁会按照时间的先后顺序来给予锁

不公平锁在等待队列随机挑选一个来给予锁

例子:银行办理业务排队,一堆人要办业务,都围在窗口前,业务员也顾不得前后,顺便就找个人办理,这样是不公平的,而公平的则是先到先办理后到后办理

怎么用锁?
要想知道怎么用锁需要清楚每个锁的特点,才能对症下药。

例子:在不带锁的情况下,线程同时进入方法,如果业务处理的是减库存又或者是加减金额,就会出现由高并发下带来的问题,导致数据错误混乱

public class SynchronizedDemo {
 
    public static void addAmount() {
        System.out.println("进入方法");
        try {
            // 模拟业务处理
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("退出方法");
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            new Thread(() -> addAmount()).start();
        }
    }
}

结果:
进入方法
进入方法
进入方法
退出方法
退出方法
退出方法

synchronized

特性:可重入,可见性
缺点:效率比较低,不够灵活,不可中断,无法感知获取锁
package com.zqh.www;
 
public class SynchronizedDemo {
 
    public synchronized static void addAmount() {
        System.out.println("进入方法");
        try {
            // 模拟业务处理
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("退出方法");
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            new Thread(() -> addAmount()).start();
        }
    }
}

进入方法
退出方法
进入方法
退出方法
进入方法
退出方法

ReentrantLock:synchronized的增强版

特性:效率较高,灵活,可感知获取锁,可公平可非公平,可中断
缺点:需在finally释放锁

import java.util.concurrent.locks.ReentrantLock;
 
public class ReentrantLockDemo {
 
    private static ReentrantLock reentrantLock = new ReentrantLock();
 
    public static void addAmount() {
        reentrantLock.lock();
        try {
            System.out.println("进入方法");
            try {
                // 模拟业务处理
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("退出方法");
        } finally {
            reentrantLock.unlock();
        }
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            new Thread(() -> addAmount()).start();
        }
    }
}

进入方法
退出方法
进入方法
退出方法
进入方法
退出方法

ReadWriteLock

特性:效率较高,灵活,可感知获取锁,读写分离控制(读多写少),读读并行,读写串行,写写串行
缺点:需在finally释放锁
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
 
public class ReadWriteLockDemo {
    private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
    private static Lock readLock = reentrantReadWriteLock.readLock();
    private static Lock writeLock = reentrantReadWriteLock.writeLock();
    private static volatile int value = 0;
 
    public static void readAmount() {
        readLock.lock();
        try {
            System.out.println("查看金额:" + value);
            try {
                // 模拟业务处理
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } finally {
            readLock.unlock();
        }
    }
 
    public static void addAmount() {
        writeLock.lock();
        try {
            System.out.println("进入方法");
            try {
                // 模拟业务处理
                ++value;
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("退出方法");
        } finally {
            writeLock.unlock();
        }
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            new Thread(() -> readAmount()).start();
        }
        for (int i = 0; i < 3; i++) {
            new Thread(() -> addAmount()).start();
        }
    }
}

标签:Thread,void,System,public,static,方法,什么
From: https://blog.csdn.net/m0_59679869/article/details/139510475

相关文章

  • IPFoxy Tips:什么是IP黑名单与白名单?
    在IP代理使用中,我们经常听到黑名单与白名单两个名词,它们不仅提供了强大的防御机制,还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。一、IP黑名单和白名单定义IP黑名单与IP白名单是网络安全中两种常用的控制手段,在代理IP中,我们也......
  • IP代理池是什么?
    从事跨境行业的朋友们总会有一个疑问,为什么自己所合作的IP代理商的IP在使用的过程中账号会有莫名封禁的问题,会不会是自己在使用的过程中错误的操作违反了平台的规则,其实不然有可能会是IP代理池纯净度不高的问题,有可能自己在使用的IP代理池已经被污染或是其他人用过的已用标签的......
  • 亚马逊对IP的要求是什么?
    IP的全称为InternetProtocol,是TCP/IP体系中的网际层协议,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。IP规定网络上所有的设备都必须有一个独一无二的IP地址,就好比是邮件上都必须注明收件人地址,邮递员才能将邮件送到。一、亚马逊对IP的要求是什么?要想成......
  • 什么是Web应用--以JavaWeb为例
    Web应用(WebApplication)是指通过Web浏览器访问的应用程序。与传统的桌面应用不同,Web应用运行在服务器上,通过网络传输数据,并在客户端浏览器中显示和操作。这种架构具有跨平台、易于更新和维护等优势。Web服务器的作用Web服务器在Web应用中扮演着重要角色,主要功能包括:接收......
  • 令你醍醐灌顶的一句话是什么
    令你醍醐灌顶的一句话是什么?职场江湖​分享外面看不到的职场经验、人情世故和社会潜规则已关注 33人赞同了该文章1、层次越低的人,反驳欲就越强。 2、如果别人说你两句,你就受不了,被两句话干扰得吃不好,睡不好你得有多脆弱,你要明白的,能干扰你的,往往......
  • 字符数组VS字符串(一文搞懂有什么区别)
    当你在C++的程序中,经常会遇到两种字符串的表达方法,一种是以字符数组的方式,还有用string的,这二者到底有什么不同?下文将会帮彻底弄懂。因为许多函数参数当需要传入字符串的时候,有的代码中使用指向字符数组的指针来传递字符串,其实C++中传入字符数组,就相当于传入一个指向该数......
  • 为什么我们需要在软件本地化过程中使用术语服务?
    你知道软件翻译和本地化的术语服务吗?此解决方案涵盖源术语和目标术语的创建、开发和维护。所有术语都存储在具有多个字段的数据库中,包括术语定义、用法示例、上下文和历史记录。这使我们能够正确处理每个术语的创建或更改请求,避免创建重复的术语或多次更改单个术语。如果您仍......
  • 程序员为什么要学习AI大模型?
    前言在科技浪潮的推动下,人工智能(AI)技术已经成为推动软件行业发展的核心动力。而在AI技术的众多分支中,AI大模型以其巨大的潜力和广泛的应用场景,逐渐成为了程序员们关注的焦点。本文将从程序员的角度出发,探讨AI大模型的定义、应用,以及为何程序员需要深入了解大模型的相关知识......
  • C语言杂谈:函数栈帧,函数调用时到底发生了什么
            我们都知道在调用函数时,要为函数在栈上开辟空间,函数后续内容都会在栈帧空间中保存,如非静态局部变量,返回值等。这段空间就叫栈帧。    当函数调用,就会开辟栈帧空间,函数返回时,栈帧空间就会被释放。这里的释放并非清空,而是让其无效化,可以后续的使用。1,......
  • 什么是黑客和白帽子
    什么是黑客和白帽子在数字化时代的浪潮中,网络安全问题日益凸显其重要性。黑客和白帽子,这两个在网络安全领域常被提及的术语,虽然都与计算机系统的安全性息息相关,但他们的角色、行为以及社会定位却截然不同。一、黑客黑客,这个词汇在公众的印象中往往带有神秘甚至负面的色彩。传统......