java读写锁的使用场景 多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?
多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?下面简要解释一下原因:锁定是因为操作不是原子的。让我们用操作一来解释它。看下面两个图。我这个操作需要看上面的第二个图,你能很清
多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?
下面简要解释一下原因:
锁定是因为操作不是原子的。让我们用操作一来解释它。看下面两个图。
我这个操作需要
看上面的第二个图,你能很清楚地理解这个过程吗?
锁定是为了确保上述三个步骤是原子操作。
回到问题上来,只有一个线程要写,没有竞争,所以不需要锁定。
但是,如果你看第一张图片,因为主内存和本地内存的存在
在一个线程写入后,其他线程无法立即看到它。这就是可见性问题。
添加volatile关键字后,它将在操作后强制工作内存和主内存同步,以确保其他线程可以立即看到它。
什么时候需要分布式锁?
首先,我们需要知道在非分布式环境中使用锁可以解决什么问题?
多线程环境,共享资源线程安全问题!此时,共享资源通常在一台机器的多线程中竞争。从JAVA内存模型的角度来看,我们可以通过锁定对象、方法和代码块来避免共享资源的竞争
!1,生成全局ID;
2,修改全局配置文件;
3,分布式服务中的seckill;
4,分布式环境中的重复提交;
1,使用数据库的唯一主键实现锁定
!2、使用redis指令:通常使用setnx方法,incr方法实现
3、使用zookeeper:使用API生成临时节点实现锁定
volatile应用在什么场景?
Volatile有五种使用场景:1。作为状态标志
2。一次性安全释放
3。独立观察
4。易失bean模式
5。低成本读写锁定策略
学习复杂技术必须通过简单的生活实例来理解和记忆,否则你永远不会掌握它
!锁用于高并发多线程模型,解决共享资源的安全问题!防止数据错误
!让我们用例子来讨论这些锁定机制:2。条件锁:也称为条件变量锁。当两个人去酒店吃饭,当你去厕所,你发现有人(其他线程正在执行)敲门。里面的人说:你先去吃饭,等我,我叫你哈!然后你回去等着!(没有竞争),等他准备好给你打电话(唤醒线程),你就可以继续执行了
!4. 旋转锁:同一个场景,同一个坑!一个人已经占了坑,但你很匆忙。你得把裤子拉出来。你该怎么办?一直敲门(循环搜索看看你能不能拿到锁),然后说,我赶时间!直到里面的人厌倦了出来,你才进去好好上厕所(执行线程)!你一直在敲门(一直在使用CPU资源)
如何理解互斥锁、条件锁、读写锁以及自旋锁,它们的区别在哪?
记住你可以做一个程序,比如寻找定点单词的程序。我只是不记得了。人们真的很蠢。