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资源)

如何理解互斥锁、条件锁、读写锁以及自旋锁,它们的区别在哪?

记住你可以做一个程序,比如寻找定点单词的程序。我只是不记得了。人们真的很蠢。