锁——数据同步离不开它

锁的种类:当我们刚接触到线程的时候,“锁”是一个不可避免的话题,按照锁的名称来说,可以有这些分类方式:
对象锁/类锁,公平锁/非公平锁,自旋锁,可重入锁,偏向锁/轻量级锁/重量级锁,悲观锁/乐观锁,共享锁/排它锁,读写锁,互斥锁,显式锁/隐式锁,内置锁等等。
对象锁:当synchronized修饰的是非静态方法或代码块时,代表锁住的是当前对象,使用格式有以下几种:
synchronized 方法名;
synchronized(this);
synchronized(任一对象);
前两者锁住当前对象,后者锁住任意一个对象
类锁:当synchronized修饰的是静态方法时或代码块,由于一个类中的静态方法和静态变量在内存中只有一份,所以,当将一个静态方法或代码块被关键字synchronized修饰时,此类的所有对象都将会共用同一把锁,将其称为类锁,使用格式有以下两种:
static synchronized 方法名;直接在静态方法中加入synchronized关键字进行修饰
synchronized(类的class对象);

公平锁:公平锁是严格按照线程启动的顺序进行执行,在线程请求时,如果资源正在被占用,线程将会放置到一个先进先出的队列中进行排队等候,然后按照先进先出的策略进行加锁
优点:所有线程都会得到资源
缺点:除了第一个线程,其他线程都会堵塞,CPU唤醒开销大
非公平锁:非公平锁允许插队,执行顺序抢占决定,在线程请求时,当新线程发现没有线程正在使用资源时,将会试图抢占资源,如果资源被占用,则同样加入队列
优点:CPU无需唤醒线程,减少开销
缺点:有些线程永远不能得到线程,导致饿死
实现:公平锁和非公平锁都可以使用ReentrantLock实现
默认非公平锁:ReentrantLock lock = new ReentrantLock();
构造器传入false仍是非公平锁:ReentrantLock lock = new ReentrantLock(false);
实现公平锁:传入true:ReentrantLock lock = new ReentrantLock(true);

/**
     * Creates an instance of {@code ReentrantLock}.
     * This is equivalent to using {@code ReentrantLock(false)}.
     */
    public ReentrantLock() {
        sync = new NonfairSync();
    }

    /**
     * Creates an instance of {@code ReentrantLock} with the
     * given fairness policy.
     *
     * @param fair {@code true} if this lock should use a fair ordering policy
     */
    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

FairSync()和NonFairSync()是ReentrantLock类的两个静态内部类,顾名思义,分别代表了公平锁和非公平锁
内部实现的主要区别在于:
非公平锁当线程进入时,直接判断锁状态值是否为0,为0代表锁没被占用,则可以直接使用,否则进入队列等待
公平锁当线程进入时,除了判断锁状态值,还需要判断有无正在等待线程,有则加入队列,否则获取锁

自旋锁:自旋锁的含义为:当一个线程尝试获取到锁未成功时,不会进入阻塞状态,而是不断地循环,试图获取锁,直至线程成功获取到锁
优点:不会进行线程间的切换,减少了不必要的操作,使程序执行速度加快
缺点:若当前线程执行时间过长,会导致其他线程一直自旋,极度消耗CPU
实现:利用CAS算法能够实现简单的自旋锁
互斥锁:当一个线程尝试获取锁失败时,进入阻塞状态

可重入锁:可重入锁可以理解为当同一线程获取了锁,并且进入了方法A中,该线程在A没有释放锁的时候,可以进入另一个方法B,例如在外层函数获得锁之后,并没有退出函数的情况下,内层函数仍然可以获取到该锁
常用的synchronized和ReentrantLock都是可重入锁
优点:可以在一定程度上避免死锁

偏向锁:在程序应用过程中往往会发现这样一件事:锁总是由同一个线程占用,而很少有竞争的发生,这种情况则可以使用偏向锁,,减少性能的消耗
轻量级锁:当偏向锁中出现线程竞争的情况时,获得偏向锁的线程会被挂起,偏向锁将会升级,成为轻量级锁,轻量级锁和偏向锁一样,同样是使用CAS来判断是否有线程在进行长期竞争,如果有竞争,将会膨胀为重量级锁
重量级锁:指的是当一个线程获取锁时,其他线程将会直接挂起,进入阻塞状态,与常用synchronized加锁类似

悲观锁:每次读取数据时都认为其他线程会对其进行更改,适用于多写的场景
乐观锁:每次读取数据时都认为其他线程不会对其进行更改,适用于多读的场景

共享锁:称为读锁,若线程对数据加上读锁,则所有线程都可以进行数据的读取,但无法进行数据的写入
排它锁:又称为写锁,若线程对数据加上写锁,则只有该线程能够对其读写操作,其他线程都无法
对数据做任何操作

显式锁:主要指lock
隐式锁:主要指synchronized
二者区别:

区别locksynchronized
层面接口关键字
分类显式锁隐式锁
释放需要手动释放锁不需要手动释放锁
使用指定起始结束位置加在方法或代码块上
大量线程时性能
异常没释放可能产生死锁自动释放,故不会产生死锁
### 数据同步的概念与实现方式 #### 一、数据同步概述 数据同步是指在不同系统之间保持数据一致性的一种技术手段。它通常用于分布式环境下的多个数据库实例或者跨平台之间的数据交换场景。常见的应用场景包括但不限于:MySQL 到 Oracle 的数据迁移[^2],利用阿里云开源工具 DataX 进行 MySQL 数据同步[^1],以及通过 GoldenGate 将 Oracle 数据实时同步至 Kafka 平台供 Flink 流式处理[^4]。 #### 二、具体实现方法分析 ##### (一)基于存储过程的方式 对于某些特定业务逻辑较为复杂的情况,可以借助于数据库自身的 **存储过程** 功能来完成部分预处理工作后再实施同步操作。例如,在使用 DataX 工具时可以通过如下 SQL 调用来触发目标端已定义好的存储过程 `call test()` 来辅助验证同步流程是否正常运行: ```sql CALL test(); ``` 此命令会在每次同步过程中被执行一次,从而确保源表结构变更能够及时反映到目的库上。 ##### (二)跨关系型数据库间的数据传输机制探讨 当涉及到不同类型的关系型数据库(如 SQL Server Oracle)间的互连互通时,则需考虑采用专门设计为此类需求服务的产品或框架作为中间桥梁连接两端并负责协调整个复制周期内的各项事务管理活动。一种可行的技术路线描述如下所示: - 使用 ETL(Extract Transform Load) 类软件产品; - 借助第三方商用解决方案比如 IBM InfoSphere DataStage 或者 Talend Open Studio 等; 上述提到的方法均能有效支持大规模批量加载作业的同时还兼顾到了增量更新模式的支持能力。 ##### (三)前端开发领域中的异步转同步策略研究 除了传统意义上的后台服务器层面之外,在现代 Web 应用程序构建过程中也经常遇到类似的挑战——即如何妥善安排前后端交互次序使得用户体验更加流畅自然而不至于因为长时间等待响应而感到烦躁不安。针对这一现象提出了几种常见应对措施之一便是运用 JavaScript 中最新的 async/await 关键字组合形式简化原本繁杂冗长的传统回调函数链路结构进而达到提高可读性维护便利性的双重效果[^3]。 以下是利用 Vue.js 结合 Axios 发起 HTTP 请求的一个简单例子演示了如何正确应用这些新特性: ```javascript async function fetchData() { try { const response = await axios.get('https://api.example.com/data'); console.log(response.data); return response.data; } catch (error) { console.error(error); } } fetchData().then(data => { /*后续依赖该结果的操作*/ }); ``` 以上代码片段展示了通过声明一个返回 Promise 对象的匿名内部函数配合外部显式的 then 方法调用来控制执行顺序的过程。 #### 总结说明 综上所述可以看出无论是底层基础设施建设还是高层应用程序架构设计都离不开围绕着高效稳定可靠这三个核心要素展开深入探索实践才能最终达成预期目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值