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个事务的共享锁

接下来,两个并发的事务分别进行写操作 -> 两个事务都尝试将自己的共享锁升级为排他锁

数据库提供了自动检查死锁的机制,如果一个事务的操作可能造成死锁,则会报错并回滚该事务,释放该事务添加的任何锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值