如何建立公司网站链接网络设计是本科
- 作者: 五速梦信息网
- 时间: 2026年03月21日 09:51
当前位置: 首页 > news >正文
如何建立公司网站链接,网络设计是本科,我的网站搜索不到了,归客手游代理平台目录 悲观锁#xff1a;乐观锁#xff1a;CAS算法:版本号机制#xff1a;write_condition 机制#xff1a;时间戳#xff1a;ReentrantLock 类#xff1a; 独占锁#xff1a;synchronized 关键字#xff1a; 悲观锁#xff1a; 1、理解#xff1a;总是假设最坏的情况… 目录 悲观锁乐观锁CAS算法:版本号机制write_condition 机制时间戳ReentrantLock 类 独占锁synchronized 关键字 悲观锁 1、理解总是假设最坏的情况每次去拿数据的时候都认为别人会修改所以每次在拿到资源的时候都会上锁这样别人想拿这个数据就会阻塞直到它拿到锁。 共享资源每次只给一个线程使用其他的线程阻塞用完后再把资源转让给其他线程。 2、技术实现Java中的 synchronized 关键字 和 ReentrantLock 类 等独占锁就是悲观锁思想的实现。 3、应用场景传统关系型数据库Mysqloracle里面就用到了很多这种锁机制比如行锁、表锁读锁synchronized、写锁排他锁等都是在做操作之前先上锁。 一般来说当并发访问和修改的冲突情况比较频繁、数据更新的冲突概率较高时应该采用悲观锁以防止读写冲突保障数据的安全性。如银行转账等操作 4、优点可以保证共享资源的数据一致性和完整性避免多个线程同时修改共享资源导致的数据混乱和错误。 5、缺点可能会因为加锁和解锁导致死锁、性能问题、资源争用等问题锁冲突问题多。 乐观锁 1、理解总是假设最好的情况每次去拿数据的时候都认为 别人不会去修改所以不会上锁但是在更新数据的时候会去判断一下在此期间别人有没有去更新这个数据。 2、技术实现 版本号机制 和 CAS 算法 都是乐观锁的实现方式。 3、应用场景 1、乐观锁适用于写比较少的情况多读场景这样可以提高吞吐量 2、NoSQL非关系型数据库提供的类似 write_condition 机制其实都是提供的乐观锁 当读操作远远超过写操作的情况下应该优先考虑采用乐观锁因为悲观锁需要先假定数据发生了冲突然后再加锁进行保护这种加锁操作会影响系统的性能乐观锁适用于数据冲突的概率较小的情况。如微博访问等 4、优点 1、减少锁冲突通过数据版本控制的方式来保证数据在多个线程中的一致性 2、性能高不需要进行加锁、解锁等操作可提高系统的并发量和吞吐量 3、方便实现版本号控制或者时间戳等方式对数据的一致性进行控制 4、允许并发访问允许多个线程同时访问同一份数据只有在数据版本号发生变化时才会发生异常从而保证了数据在并发访问时的一致性和完整性 5、缺点 1、自旋CAS算法导致的ABA问题 一个变量V初次读取的时候是A值并且在准备赋值的时候检查到它仍然是A值但是在这段时间内它的值可能被修改成其他的值然后又被改回A那么CAS操作就会误认为它从来没有被修改过这个问题就被称为CAS操作的ABA问题 2、循环时间长开销大 自旋CAS就是不成功就一直循环执行直到成功如果长时间不成功会给CPU带来非常大的执行开销。 (优化方法如果JVM能支持处理器提供的pause指令cpu指令让线程在执行的过程中主动暂停一段时间那么效率就可以提升) 3、只能保证一个共享变量的原子操作 CAS只对单个共享变量有效当操作涉及跨多个共享变量时CAS无效。 但是JDK1.5之后有个AtomicReference类利用这个类我们可以将多个变量放在一个对象里面来进行CAS操作将多个共享变量合并成一个共享变量来操作 CAS算法: 1、概念 cas是Java中Unsafe类中的一个方法即 compare and swap比较与交换是一种有名的无锁算法。就是在不使用锁的情况下实现多线程之间的变量同步也就是在没有线程被阻塞的情况下实现变量的同步所以也叫非阻塞同步。 cas算法涉及到三个操作数需要读写的内存值V进行比较的值A要写入的新值Bcas会一直自旋的判断V值是否等于A值相同才会写入新值不相同就重新获取最新的内存值进行业务逻辑操作后再进行比较。 示例 大白话 1、线程A和线程B都要去获取内存值进行操作 2、线程A拿到内存值V时V0然后就去对V值执行操作 3、此时线程B也获取到内存值V获取到的V值也0然后也去执行操作然后线程B执行速度比较快执行完业务逻辑操作后就再去拿一遍内存值V把两次获取到的V值进行对比如果一致说明线程B在执行操作的这段时间内内存值V的值没有被其他线程修改过所以线程B就可以把自己执行完操作后的最新值赋值给内存值V此时内存值V就被线程B从0修改成1了。 4、然后此时的线程A也执行完操作了也同样再次去获取内存值V此时线程A获取到的内存值V已经是被线程B修改过的1了所以和刚开始获取到的V值0进行对比发现不相等说明在线程A执行操作的时候已经有其他线程把内存值V的值修改了所以此时的线程A就不能把刚刚执行完的值赋值给V了。 5、线程A就只能再重新去获取内存值V进行操作此时线程A拿到的内存值V 1然后再重新操作操作完再去获取最新的内存值如果没被其他线程修改过则内存值V 1再拿来跟执行操作前获取到的V值V1进行对比如果对比一致说明这次在线程A执行操作的过程中没有其他线程修改过内存值B所以线程A就可以把自己执行操作的值赋值给内存值。 6、如果线程A对比发现一开始获取到的内存值和执行完业务逻辑后再去获取的内存值 不一致那么就继续获取最新的内存值再继续做业务逻辑操作操作完再继续拿最新的内存值和一开始的进行对比这个过程就叫做自旋。 版本号机制 一般是在数据表中加上一个数据版本号version字段表示数据被修改的次数当数据被修改的时候version值就会1。 当线程A要更新数据值的时候在读取数据的同时也会读取version值在提交更新的时候会再次读取那条数据的version值如果两个version值一样的话才会更新数据否则就重试刚刚的更新数据操作直到更新成功。 因为如果没有对比version值那么线程A在修改数据的期间有其他线程修改相同的那条数据并提交那么就会导致数据出错出现旧数据覆盖新数据等这种情况。 提交版本的version值必须要大于记录当前版本的version值才能执行更新。 write_condition 机制 可以先理解为是版本号机制的一种体现版本号机制是为表添加一个版本号的字段write_condition是根据表中的某个字段的状态来判断数据是否被修改过 时间戳 MySQL中的timestamp或者自己在表中新增一个字段用于存储时间戳就是在执行数据更新时除了比较版本号之外还需要比较时间戳。在执行数据更新时同时需要更新时间戳的数据 一般有两种方式 一种是在数据库层面通过触发器等方式自动更新时间戳字段 另一种是在应用层面手动更新时间戳字段 ReentrantLock 类 就是创建一个类ReentrantLock.lock()获取锁然后try/catch写代码ReentrantLock.unlock()释放锁。 当使用 ReentrantLock 时需要手动获取和释放锁否则会导致死锁或其他问题。因此建议使用 try…finally 结构来保证锁的正确释放 独占锁 独占锁是同步锁的一种。同步锁是一种在多线程环境下同步访问共享资源的机制其主要目的是为了避免多个线程同时对共享资源进行读写操作而导致的数据不一致性问题。独占锁是同步锁的一种它在同一时间只允许一个线程访问共享资源其他线程必须等待当前线程释放锁之后才能访问共享资源。 在Java中实现独占锁的方式是通过synchronized关键字或者ReentrantLock类进行实现。当一个线程获得了锁之后其他线程就必须等待它释放锁之后才能尝试获取锁。独占锁的使用可以有效地避免多个线程同时访问共享资源而导致的数据不一致性问题但是也会带来一定的性能损失和死锁的风险需要在实际应用中进行权衡和优化。 synchronized 关键字 实现方式方法用 synchronized关键字修饰这个方法就算是加锁了可以叫实例锁、对象锁。这个方法在任意时刻只能允许一个线程访问。 流程理解 A线程想调用这个方法就必须先获取到这个实例关联的锁对象锁、实例锁获取到后才能执行方法里面的代码其他线程如果也想访问这个方法但是这个方法已经被A线程获取其他线程就会被阻塞直到A线程执行完释放锁之后其他线程才能获取锁。 锁的获取方式是通过Java虚拟机底层的监视器机制实现的不需要我们写代码在我们去调用这个方法的时候底层自己就会去获取锁如果已经被其他线程获取了就会进行等待直到锁被释放。 当线程A调用一个被synchronized修饰的方法但是该锁已经被其他线程占用时线程A会进入到对象的monitor状态等待获取锁的机会。每个对象都拥有monitor这个监视器锁。monitor是用来协调多个线程对该对象的访问。通过synchronized关键字修饰的方法或者代码块就是使用该对象的monitor监视器锁来实现锁功能的。 在等待的过程中线程A会被放置在对象的monitor里面的等待队列中等待获取锁的机会。当该锁被释放时Monitor就会通知等待队列中的一个或多个线程来争夺锁的获取。如果这个时候线程A争到这个锁就可以执行被synchronized关键字修饰保护的代码否则就继续回到等待队列等待直到获取到锁为止。 释放锁 线程A执行完按方法里面的代码后会自动释放锁的当线程A执行完同步代码块之后虚拟机会自动将获取锁的标识清除。 线程A也可以调用wait()方法主动释放锁。 如果线程A在执行完synchronized修饰的代码块之后没有通知通过调用notify()或notifyAll()方法其它等待的线程那么其它线程就没办法知道锁什么时候会被释放就会无限期的等待下去。
- 上一篇: 如何建立公司网站多少钱找网站的方法
- 下一篇: 如何建立免费网站企业网站制作设计
相关文章
-
如何建立公司网站多少钱找网站的方法
如何建立公司网站多少钱找网站的方法
- 技术栈
- 2026年03月21日
-
如何建立公司的销售网站ai设计logo免费网站
如何建立公司的销售网站ai设计logo免费网站
- 技术栈
- 2026年03月21日
-
如何建立本地网站营销平台网站建设
如何建立本地网站营销平台网站建设
- 技术栈
- 2026年03月21日
-
如何建立免费网站企业网站制作设计
如何建立免费网站企业网站制作设计
- 技术栈
- 2026年03月21日
-
如何建立内部网站做优化的网站用什么空间好
如何建立内部网站做优化的网站用什么空间好
- 技术栈
- 2026年03月21日
-
如何建立网站教材图书管理系统网站开发设计过程
如何建立网站教材图书管理系统网站开发设计过程
- 技术栈
- 2026年03月21日






