IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 线程的锁synchronized -> 正文阅读

[网络协议]线程的锁synchronized

一:锁的概念

只有获取到这个锁后才会执行相应的代码,可以用任意对象当作锁
例如:

public class T {
    private int count = 0;

    Object o = new Object();
    public void m() {
        synchronized(o) {
            count ++;
            System.out.println(Thread.currentThread().getName()+"count="+count);
        }
    }
}

二:锁的几种方式

  1. synchronized(this) // 锁定当前对象,获取到this锁才会执行相应代码
  2. public synchronized void k() {} // 等同于synchronized(this)
  3. 静态方法加锁
public class T {
    private static int count = 0;
    // 等同于synchronized(T.class)
    public synchronized static void n () {
        count ++;
        System.out.println(Thread.currentThread().getName()+"count="+count);
    }
}

三:锁的使用场景

比如多个线程对同一个数据进行读写,若不加锁将可能会出现脏读
例子:

/**
 * 模拟银行账户
 * 对业务写方法加锁
 * 对业务读方法不加锁
 *
 * 这样将会容易出现脏读:即读到的内容是写过程前的数据,此时正在写但还未写完成
 * @author 86152
 */
public class Account {
    String name;
    Double balance = 0.0;

    public synchronized void set(String name,Double balance) {
        this.name = name;
        try {
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }
        this.balance = balance;
    }

    public Double get() {
        return balance;
    }

    public static void main(String[] args) {
        Account account = new Account();
        new Thread(()->{
            account.set("zhangsan",100.0);
        }).start();

        try {
            TimeUnit.SECONDS.sleep(1);
        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println(account.get());

        try {
            TimeUnit.SECONDS.sleep(2);
        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println(account.get());

    }

}

结果:

0.0
100.0

读写均加锁后:

public class Account {
    String name;
    Double balance = 0.0;

    public synchronized void set(String name,Double balance) {
        this.name = name;
        try {
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }
        this.balance = balance;
    }

    public synchronized Double get() {
        return balance;
    }

    public static void main(String[] args) {
        Account account = new Account();
        new Thread(()->{
            account.set("zhangsan",100.0);
        }).start();

        try {
            TimeUnit.SECONDS.sleep(1);
        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println(account.get());

        try {
            TimeUnit.SECONDS.sleep(2);
        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println(account.get());

    }

}

加锁后结果:

100.0
100.0

A获取到锁后,在A未执行完并释放锁时B不能执行同样需要锁的代码。只有等A释放锁后B获取到锁B才能继续执行。

四:synchronized是可重入锁

public synchronized void m() {
m1();
}

public synchronized void m1() {
}

一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会得到该对象的锁。也就是说synchronized获得的锁是可重入的

五:异常和锁

程序在执行过程中,如果出现异常,默认情况下锁会被释放。所以在并发处理过程中,要注意同步代码中出现异常可能会出现数据不一致情况。
例如:多线程访问同一资源,如果异常处理不合适,在第一个线程中抛出异常,其它线程将会进入同步代码区,有可能会访问到异常产生时的数据。
因此:处理同步业务逻辑时要谨慎处理异常

六:总结

注意:在非必要加锁的情况下,能不加锁就不加,因为加锁后会严重影响效率

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 19:06:09  更:2022-03-30 19:10:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:36:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码