84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
写锁降级的时候 要求当前已经获取到写锁的线程把持住写锁,然后获取读锁,随后释放写锁。
那么为什么要求把持住写锁呢??
上图中提到 “ 那么当前线程无法感知线程T的数据更新 ” 这个如何理解。如果线程T获取到了写锁,然后对数据进行了更新,在没有释放写锁之前,当前线程无法感知到数据的更新,这个是没问题的吧,但是一旦线程T释放 写锁,那么当前线程就可以感知到数据的更新了,这里理解应该没问题吧?
help me to explain,thx
光阴似箭催人老,日月如移越少年。
这是在解释锁降级吧,首先写锁是独占的,读锁是共享的,然后读写锁是线程间互斥的,锁降级的前提是所有线程都希望对数据变化敏感,但是因为写锁只有一个,所以会发生降级。如果先释放写锁,再获取读锁,可能在获取之前,会有其他线程获取到写锁,阻塞读锁的获取,就无法感知数据变化了。所以需要先hold住写锁,保证数据无变化,获取读锁,然后再释放写锁。
写锁不允许其他进程的读写操作,读锁的允许读操作。就按你抓图的例子来看,当你释放写锁后,T进程获取了写锁,这时你就无法获取读锁了,所以要先获取读锁后,再释放写锁。
首先你没理解读写锁的意义,读锁的存在意味着不允许其他写操作的存在。按照你提供的例子,可能存在一个事务线程不希望自己的操作被别的线程中断,而这个事务操作可能分成多部分操作更新不同的数据(或表)甚至非常耗时。如果长时间用写锁独占,显然对于某些高响应的应用是不允许的,所以在完成部分写操作后,退而使用读锁降级,来允许响应其他进程的读操作。只有当全部事务完成后才真正释放锁。按你的理解如果当中写锁被其他线程占用,那么这个事务线程将不得不中断等待别的写锁释放。
“ 那么当前线程无法感知线程T的数据更新 ”
T1 读取 数据 Data时,将数据值复制到当前线程的上下文,因此其他线程没有办法感知数据是否更新。只要当数据提交内存中,即Heap中,其他线程才可以得到最新值。
这是在解释锁降级吧,首先写锁是独占的,读锁是共享的,然后读写锁是线程间互斥的,锁降级的前提是所有线程都希望对数据变化敏感,但是因为写锁只有一个,所以会发生降级。
如果先释放写锁,再获取读锁,可能在获取之前,会有其他线程获取到写锁,阻塞读锁的获取,就无法感知数据变化了。所以需要先hold住写锁,保证数据无变化,获取读锁,然后再释放写锁。
写锁不允许其他进程的读写操作,读锁的允许读操作。
就按你抓图的例子来看,当你释放写锁后,T进程获取了写锁,这时你就无法获取读锁了,所以要先获取读锁后,再释放写锁。
首先你没理解读写锁的意义,读锁的存在意味着不允许其他写操作的存在。
按照你提供的例子,可能存在一个事务线程不希望自己的操作被别的线程中断,而这个事务操作可能分成多部分操作更新不同的数据(或表)甚至非常耗时。如果长时间用写锁独占,显然对于某些高响应的应用是不允许的,所以在完成部分写操作后,退而使用读锁降级,来允许响应其他进程的读操作。只有当全部事务完成后才真正释放锁。
按你的理解如果当中写锁被其他线程占用,那么这个事务线程将不得不中断等待别的写锁释放。
“ 那么当前线程无法感知线程T的数据更新 ”
T1 读取 数据 Data时,将数据值复制到当前线程的上下文,因此其他线程没有办法感知数据是否更新。只要当数据提交内存中,即Heap中,其他线程才可以得到最新值。