关于美食网站的问卷调查怎么做,wordpress导入火车头,平台网站建设ppt模板下载,建立网站怎么申请锁的简介
锁是计算机协调多个进程或线程并发访问某一资源的机制#xff08;避免发生资源争抢#xff09;
在并发环境下#xff0c;多个线程会对同一个资源进行争抢#xff0c;可能会导致数据不一致的问题。为了解决这一问题#xff0c;需要通过一种抽象的锁来对资源进行…锁的简介
锁是计算机协调多个进程或线程并发访问某一资源的机制避免发生资源争抢
在并发环境下多个线程会对同一个资源进行争抢可能会导致数据不一致的问题。为了解决这一问题需要通过一种抽象的锁来对资源进行锁定锁就是对共有的资源进行了保护保证程序在并发场景下有条不紊的安全性的运行。
锁通常需要硬件支持才能有效实施。这种支持通常采取一个或多个原子指令的形式如test-and-set, “fetch-and-add” or “compare-and-swap””。这些指令允许单个进程测试锁是否空闲如果空闲则通过单个原子操作获取锁
锁的代码理解
锁是Java并发编程中最重要的的同步机制锁除了让临界区互斥执行外还可以让释放锁的线程向获取同一个锁的线程发送消息。 锁的伪代码形式
try{lock() // 获取锁// 执行代码
}finally{unLock() //释放锁
}在lock()获取锁资源的临界点之外是无序的如果是多线程并发抢资源当A锁释放是会通知B获取锁。
锁分类
悲观锁和乐观锁
乐观锁乐观锁总是认为不存在并发问题每次去取数据的时候总认为不会有其他线程对数据进行修改因此不会上锁。但是在更新时会判断其他线程在这之前有没有对数据进行修改一般会使用“数据版本机制”或“CAS操作”来实现。
悲观锁悲观锁认为对于同一个数据的并发操作一定会发生修改的哪怕没有修改也会认为修改。因此对于同一份数据的并发操作悲观锁采取加锁的形式。悲观的认为不加锁并发操作一定会出问题。典型的数据库的查询 for update。
在对任意记录进行修改前先尝试为该记录加上排他锁exclusive locking。 如果加锁失败说明该记录正在被修改那么当前查询可能要等待或者抛出异常。具体响应方式由开发者根据实际需要决定。 如果成功加锁那么就可以对记录做修改事务完成后就会解锁了。期间如果有其他对该记录做修改或加排他锁的操作都会等待我们解锁或直接抛出异常。
排它锁和共享锁读锁和写锁
排它锁指锁一次只能被一个线程所持有其它线程只能进行等待止到锁被锁被释放从而继续尝试获取锁 共享锁指锁可被多个线程所持有。在数据库中是加读锁即事务A对数据加锁后只能读取加锁的数据不能读取其他数据其他事务可以读取均不能修改增删、改。
公平锁和非公平锁
公平锁就是很公平在并发环境中每个线程在获取锁时会先查看此锁维护的等待队列如果为空或者当前线程线程是等待队列的第一个就占有锁否则就会加入到等待队列中以后会按照FIFO的规则从队列中取到自己 非公平锁线程加锁时直接尝试获取锁获取不到就自动到队尾等待
可重入锁
就是一个进程获得了该锁后该进程调用其自己的方法该方法内有访问了这个被自己锁住的资源此时可以放行可以访问。就是在同一线程的外层方法获取锁的时候在进入内层方法自动获取锁
偏向锁/轻量级锁/重量级锁
锁优点缺点适用场景偏向锁加锁解锁无需额外的消耗如果存在锁竞争则存在锁撤销的消耗只有一个线程访问同步方法快的场景轻量级锁竞争的线程不会存在阻塞提高了程序的响应速度。若始终得不到锁竞争的线程使用自旋会消耗CPU同步块执行的速度非常的快重量级锁线程使用者不会自旋不会消耗CPU线程阻塞响应时间慢吞吐量大