项目并发遇到相关问题

在项目中,常见的并发问题包括以下几种情况:

1. 竞态条件(Race Condition):多个线程或进程同时访问和修改共享资源,导致结果的不确定性。处理竞态条件可以采用以下方法:

  • 使用互斥锁(Mutex)或信号量(Semaphore)来保护共享资源,确保同一时间只有一个线程能够访问资源。
  • 使用原子操作(Atomic Operation)来保证对共享资源的读写操作的原子性。
  • 使用线程安全的数据结构,如线程安全的集合类,来避免手动处理锁和同步。

2. 死锁(Deadlock):多个进程或线程相互等待对方持有的资源,导致系统无法继续执行。处理死锁可以采用以下方法:

  • 避免循环等待:对资源的获取顺序进行统一,避免循环依赖。
  • 使用资源分级:确保每个线程只请求当前级别的资源,避免跨级资源的请求。
  • 引入超时机制:在获取资源时设置超时时间,超时后放弃请求并释放已占有的资源。

3. 数据一致性问题:多个线程或进程同时读写共享数据,导致数据的不一致性。处理数据一致性问题可以采用以下方法:

  • 使用synchronized或Lock等同步锁
  • 使用事务(Transaction)来保证对共享数据的原子性操作。事务可以提供隔离级别,确保数据的一致性。
  • 使用乐观锁(Optimistic Locking)或悲观锁(Pessimistic Locking)来控制对共享数据的访问,避免并发冲突。
  • 使用基于分布式锁的方式来实现并发控制,例如使用 Redis、ZooKeeper 等分布式锁工具。

4. 资源限制:并发操作过多导致系统资源(如线程、内存、连接池等)耗尽。处理资源限制问题可以采用以下方法:

  • 调整系统配置:增加可用资源的数量或提高资源的限制。
  • 实现资源池:对一些资源进行池化管理,复用资源对象,避免频繁创建和销毁。

5. 缓存一致性:在分布式系统中,多个节点同时对缓存进行更新,导致缓存数据的不一致性。处理缓存一致性问题可以采用以下方法:

  • 使用分布式缓存方案,如Redis等,提供缓存的一致性保证。
  • 实现缓存失效策略,如过期时间、定期刷新等,保证缓存数据的及时更新。

除了以上情况,还可能存在其他特定的并发问题

具体处理方法应根据具体情况进行分析和选择。在开发过程中,合理的并发控制和调度
库相关操作的并发问题

我在项目中具体遇到的一个具体问题:

根据车牌号和时间创建订单时出现的并发,并发时时间可能不一致。需求是不能重复创建,使用车牌号和时间戳生成的唯一ID
开始设想是通过事务和数据库主键唯一约束实现接口幂等,使用synchronized实现方法同步避免两个事务不可见并发插入。
在实现测试时发现还是会出现并发问题,原因是因为spring的事务和synchronized冲突,事务运行是基于代理方法,锁不生效。
最终使用基于redis的分布式锁方案,在插入数据时先获取锁。

posted @ 2023-05-26 23:51  小万2333  阅读(69)  评论(0)    收藏  举报