2016 - 2024

感恩一路有你

mysql的锁有几种 多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?

浏览量:2751 时间:2021-03-16 14:20:55 作者:admin

多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?

先说结论:不必要

  • 如果不需要可见性,什么都不需要加
  • 如果需要保证可见性,则需要加volatile关键字。这里可以加锁,但是没必要,对性能有影响

下面简单解释下原因:

加锁是因为操作不是原子性的,以i 这个操作来解释,看下面两张图。

i 这个操作需要

  • 先将i的值从内存中读出来
  • 然后加1
  • 最后写回去

看上面第二张图,能很清楚的理解流程吧?

加锁就是保证上面的三步是一个原子操作。

回到问题,这里只有一个线程写,实际没有竞争,所以没必要加锁。

但是,看第一张图,因为有主内存和本地内存的存在

  • 线程先写入本地内存
  • 然后刷入主内存
  • 其它内存同步主内存到工作内存
  • 然后从工作内存中读取

一个线程写入后,不能保证其它线程立即看到,这就是可见性问题。

加了volatile关键字后,会强制操作后同步工作内存和主内存,保证其它线程立刻看到。

Mysql数据库可以加密吗?

MySQL数据库的认证密码有两种方式,MySQL4.1版本之前是MySQL323加密,MySQL4.1和之后的版本都是MySQLSHA1加密,MySQL数据库中自带Old_Password(str)和Password(str)函数,它们均可以在MySQL数据库里进行查询,前者是MySQL323加密,后者是MySQLSHA1方式加密。(1)以MySQL323方式加密 select old_password("111111")(2)以MySQLSHA1方式加密 selectpassword("111111") MYSQL323加密中生成的是16位字符串,而在MySQLSHA1中生存的是41位字符串,其中*是不加入实际的密码运算中,通过观察在很多用户中都携带了"*",在实际破解过程中去掉"*",也就是说MySQLSHA1加密的密码的实际位数是40位。

mysql的锁有几种 mysql怎么解决死锁 mysql锁表命令

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。