Synchronized

一个线程加了Synchronized关键字即加锁了,另一个线程没有加锁,两个线程共同访问共享变量,会发生什么情况?image.png

阅读 1.6k
2 个回答

我大概能明白你的意思是什么,不过你这个问题,换成数据库可能更为形象。

一个地方查询加锁(oracle),不要 commit 提交:

select * from table for update;

第二个地方查询不加锁(oracle),你会发现第二次查询并没有被阻止:

select * from table;

第三个地方查询再次加锁(oracle),此时就会被阻止:

select * from table for update;

上述数据库的查询,与 java 中 synchronized 其实同理。每一次查询都是一个线程,一个线程加了 for update 也就是加了 synchronized,共享变量实际上就是 table

因此加锁需要每一方都约定去实现加锁逻辑的,不然加锁就毫无意义。

这个问题其实并不复杂,比如一个房间,里面的东西就是共享变量。你在东边开了一扇门,然后锁上了。但是西边连墙都没有,这肯定可以同时访问啊,只是你从东边进不来而已。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题