如何处理java高并发问题

如何处理并发和同步 今天讲的如何处理并发和同同步问题主要是通过锁机制。我们需要明白,锁机制有两个层面。一种是代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized,这里我不在做过多的讲解,感兴趣的可以参考:http://www.cnblogs.com/xiohao/p/4151408.html 另外一种是数据库层次上...
如何处理java高并发问题
如何处理并发和同步
今天讲的如何处理并发和同同步问题主要是通过锁机制。

我们需要明白,锁机制有两个层面。

一种是代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized,这里我不在做过多的讲解,

感兴趣的可以参考:http://www.cnblogs.com/xiohao/p/4151408.html

另外一种是数据库层次上的,比较典型的就是悲观锁和乐观锁。这里我们重点讲解的就是悲观锁(传统的物理锁)和乐观锁。

悲观锁(Pessimistic Locking):

悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自 外部系统的事务处理)修改持保守态度,因此,

在整个数据处理过程中,将数据处于锁定状态。

悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能 真正保证数据访问的排他性,否则,即使在本系统

中实现了加锁机制,也无法保证外部系 统不会修改数据)。

一个典型的倚赖数据库的悲观锁调用:

select * from account where name=”Erica” for update

这条 sql 语句锁定了 account 表中所有符合检索条件( name=”Erica” )的记录。

本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。
Hibernate 的悲观锁,也是基于数据库的锁机制实现。
下面的代码实现了对查询记录的加锁:

String hqlStr ="from TUser as user where user.name='Erica'";

Query query = session.createQuery(hqlStr);

query.setLockMode("user",LockMode.UPGRADE); // 加锁

List userList = query.list();// 执行查询,获取数据

query.setLockMode 对查询语句中,特定别名所对应的记录进行加锁(我们为 TUser 类指定了一个别名 “user” ),这里也就是对

返回的所有 user 记录进行加锁。

观察运行期 Hibernate 生成的 SQL 语句:
select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id
as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex
from t_user tuser0_ where (tuser0_.name='Erica' ) for update
这里 Hibernate 通过使用数据库的 for update 子句实现了悲观锁机制。
Hibernate 的加锁模式有:
Ø LockMode.NONE : 无锁机制。
Ø LockMode.WRITE : Hibernate 在 Insert 和 Update 记录的时候会自动获取
Ø LockMode.READ : Hibernate 在读取记录的时候会自动获取。
以上这三种锁机制一般由 Hibernate 内部使用,如 Hibernate 为了保证 Update
过程中对象不会被外界修改,会在 save 方法实现中自动为目标对象加上 WRITE 锁。
Ø LockMode.UPGRADE :利用数据库的 for update 子句加锁。
Ø LockMode. UPGRADE_NOWAIT : Oracle 的特定实现,利用 Oracle 的 for
update nowait 子句实现加锁。
上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:
Criteria.setLockMode
Query.setLockMode
Session.lock2017-07-23
什么方面的技术,像HTTP/SOCKET/等

然后,高并发是什么数量级

~
~2017-07-23
mengvlog 阅读 9 次 更新于 2025-07-19 19:26:11 我来答关注问题0
  •  翡希信息咨询 JAVA开发在高并发访问下,数据返回速度很慢,有些甚至一直在转圈,该怎么解决,麻烦大神们给些帮助。

    针对JAVA开发在高并发访问下数据返回速度慢的问题,以下是一些解决方案:1. 优化数据库索引 建立索引:检查数据查询时过滤的字段是否已经建立了索引。索引可以极大地提高数据检索速度,特别是在高并发访问下。确保对频繁查询和过滤的字段建立合适的索引。2. 引入缓存机制 使用Redis等缓存:如果数据时效性要求...

  • (1)动静分离。静态资源请求与动态请求分离,项目中需要访问的图片、声音、js/css等静态资源需要有独立的存放位置,便于将来实现静态请求分离时直接剥离出来,比如nginx可以直接配置图片文件直接访问目录,而不需要经过tomcat。这样tomcat就可以专注处理动态请求,操作数据库数据处理之类的。静态请求代理服务器性能...

  •  翡希信息咨询 java多用户同时访问和数据库进行交互,如何能够高并发?

    异步处理:对于非实时性要求较高的操作,可以采用异步处理方式,减少用户等待时间。限流与降级:在高并发场景下,通过限流策略保护系统不被压垮,同时对于非核心功能进行降级处理,确保核心功能的稳定性。监控与调优:监控:使用监控工具对系统性能进行实时监控,及时发现并解决问题。调优:根据监控数据,对系统...

  • 使用一般的synchronized或者是lock或者是队列都是无法满足高并发的问题。二、解决方法有三:1.使用缓存 2.使用生成静态页面 html纯静态页面是效率最高、消耗最小的页面。我们可以使用信息发布系统来实现简单的信息录入自动生成静态页面,频道管理、权限管理和自动抓取等功能,对于一个大型网站来说,拥有一套高...

  • 1. 线程管理:Java的线程池技术可以有效地管理和调度线程,避免创建过多的线程导致系统资源耗尽。2. 并发控制:通过同步锁、信号量等工具控制对共享资源的访问,防止数据不一致和死锁等问题。3. 分布式架构:将系统分布在多个服务器上,通过负载均衡等技术处理大量的并发请求。4. 缓存优化:利用缓存来减少...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部