我大概能明白你的意思是什么,不过你这个问题,换成数据库可能更为形象。一个地方查询加锁(oracle),不要 commit 提交:select * from table for update;第二个地方查询不加锁(oracle),你会发现第二次查询并没有被阻止:select * from table;第三个地方查询再次加锁(oracle),此时就会被阻止:select * from table for update;上述数据库的查询,与 java 中 synchronized 其实同理。每一次查询都是一个线程,一个线程加了 for update 也就是加了 synchronized,共享变量实际上就是 table。因此加锁需要每一方都约定去实现加锁逻辑的,不然加锁就毫无意义。
我大概能明白你的意思是什么,不过你这个问题,换成数据库可能更为形象。
一个地方查询加锁(oracle),不要 commit 提交:
第二个地方查询不加锁(oracle),你会发现第二次查询并没有被阻止:
第三个地方查询再次加锁(oracle),此时就会被阻止:
上述数据库的查询,与 java 中 synchronized 其实同理。每一次查询都是一个线程,一个线程加了
for update
也就是加了synchronized
,共享变量实际上就是table
。因此加锁需要每一方都约定去实现加锁逻辑的,不然加锁就毫无意义。