读写锁使用场景 什么时候需要分布式锁?
什么时候需要分布式锁?
首先,我们需要知道在非分布式环境中,什么可以用锁来解决?
多线程环境,共享资源线程安全问题!此时,共享资源通常在一台机器的多线程中竞争。从JAVA内存模型的角度来看,我们可以通过锁定对象、方法和代码块来避免共享资源的竞争
!1,生成全局ID;
2,修改全局配置文件;
3,分布式服务中的seckill;
4,分布式环境中的重复提交;
1,使用数据库的唯一主键实现锁定
!2、使用redis指令:通常使用setnx方法,incr方法实现
3、使用zookeeper:使用API生成临时节点实现锁定
读锁和写锁区别?
共享锁也称为读锁。如果事务t将s锁添加到数据对象a,则事务t可以读取a,但不能修改a。其他事务只能将s锁添加到a,而不能添加x锁,直到t释放a上的s锁。这确保了其他事务可以读取a,但在t释放a上的s锁之前,t不能对a进行任何更改。
独占锁(x锁)也称为写入锁上。如果事务t对数据对象a应用x锁,则事务t可以读取a或修改a。在事务t释放对a的锁之前,其他事务不能对a应用任何锁。这将确保在事务t释放对a的锁之前,其他事务不能再读取和修改a
请记住,您可以编写程序,就像找到一个固定的词。我只是不记得了。人们真的很蠢。
给你一个含有1亿个QQ号码的文件,如何快速的查找某个QQ号码?
下面简要说明以下原因:
锁定是因为操作不是原子的。让我们用操作一来解释它。看下面两个图。
我这个操作需要
看上面的第二个图,你能很清楚地理解这个过程吗?
锁定是为了确保上述三个步骤是原子操作。
回到问题上来,只有一个线程要写,没有竞争,所以不需要锁定。
但是,如果你看第一张图片,因为主内存和本地内存的存在
在一个线程写入后,其他线程无法立即看到它。这就是可见性问题。
添加volatile关键字后,它将在操作后强制工作内存和主内存同步,以确保其他线程可以立即看到它。
多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?
看来没人能说到点子上。让我简单地说一下:raid中有一个很大的问题,叫做write hole,就是写文件时突然断电,文件没有完成,检查代码是基于整个文件的。所有级别的raid都有此问题。对于raid5,这个问题尤其严重,因为当出现问题时,系统并不知道有问题。直到一个磁盘完全损坏,您用一个新磁盘替换它,RAID系统重新构建,您会发现检查代码和文件内容是不同的。
更好的硬件raid卡,采用多种方法避免突然掉电,什么小电池啊,NVRAM啊等等。
软件RAID根本没有此功能。至于家庭NAS或服务器,很少有ups。另外,有些人有随意关机的习惯,所以更容易带来写洞。平时我什么也感觉不到。出了什么事哭都来不及了。这也是软件RAID使用越来越少的事实。在正式应用中,没有软件RAID。
如果您真的想使用soft,您必须使用ZFS或其他东西。ZFS采用raid-z的软件方法来解决写孔问题。这种方法称为写时复制。Raid-z与Raid-5类似,但它不是Raid本身,更不是软件Raid。由于copy-on-write,ZFS可以随时检查和更正检查代码。代价是ZFS需要大量的内存和计算。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。