Java中的读写锁解决方案
Java中的读写锁解决方案
Java中的读写锁解决方案:
JavaEE中的四大作用域
JavaEE设计的4个可以进行数据共享的组件。
生命周期、作用范围、用途。
page作用域,对应的PageContext,在JSP中生效。PageContext对象的生命周期是当有请求到达页面(jsp)时创建,当请求离开页面(jsp)时销毁,生命周期非常短,仅能够在当前页面内部实现数据共享。
request作用域,对应的HttpServletRequest对象,在一次请求中生效。Reqeust对象的生命周期是当一个请求到达服务器时创建,当请求对应的响应要离开服务器之前被销毁。因此,它可以在一次请求中经过的所有组件之间实现数据共享。
session作用域,对应的HttpSession对象,在用户的一次会话中生效。session的生命周期是:当用户第一次调用request.getSession()
时创建,默认可以存活30分钟,从用户最后一次访问session开始计算。因此,session可以在用户的一次会话期间,在各组件之间实现数据共享。Session的另一个核心特点是,每个用户会有属于自己的一个Session对象,不同用户之间的数据是隔离的。
application作用域,对应的ServletContext对象,在一次Web应用的运行期间生效。ServletContext的生命周期是:服务器启动时,会按顺序加载每一个Web应用,每加载完1个Web应用,会自动创建一个ServletContext对象,唯一代表该Web应用。该对象会一直驻留在内存中,直到服务器关闭或者当前Web应用被移出容器时,随Web应用的销毁而销毁。因此,ServletContext可以在整个Web应用内部实现数据的共享。需要注意,ServletContext仅有一个,所有用户共享的数据,如果变量名相同,会彼此覆盖。ServletContext适合存放所有用户共同的数据,不适合存放每个用户特有的数据。
数据库的锁机制:
- 数据库中的锁机制?
共享锁(读锁):共享锁可以和共享锁并存
排他锁(写锁):排他锁不能和任何锁并存
不加锁的操作:和任何锁都可以并存
- 不同隔离级别下,各类操作加什么锁?
非Ser级别:查询不加锁
Ser级别:查询加共享锁
所有级别:更新(增、删、改)加排他锁
在所有的隔离级别下,多个事务的并发查询操作不会互斥。
在隔离级别较低的情况下,一读一写互斥的概率较低。
在隔离级别较高的情况下,一读一写互斥的概率较高。
在任何级别下,两个写操作是会互斥的。
- 数据库中的死锁
隔离级别是Serializable级别
两个并发的事务,先分别进行读操作 -> 表上添加了2个事务的共享锁
接下来,两个并发的事务分别进行写操作 -> 两个事务都尝试将自己的共享锁升级为排他锁
数据库提供了自动检查死锁的机制,如果一个事务的操作可能造成死锁,则会报错并回滚该事务,释放该事务添加的任何锁。