JAVA多线程下,获取递增的序列号

场景描述:

   1,目前我们的系统可以简单归纳成MVC的架构模式

2,每个前端的请求过来,都会在C层开启事务,最后处理结束后,也在在C层关闭事务(实际是在C层的底层统一做了事务的开启和提交);        

问题描述:

       有一个接口方法,用于获取数据库中的序列号,然后+1再保存到数据库。

客户的报障是:并发情况下出现了单号重复,也就是多个线程同时取到了相同的序列号,而不是等到上一个线程将序列号+1后的值。  

问题分析:

       初步分析,存在两个问题:

1,方法的锁不起作用

2,序列号+1的事务提交有问题

解决方案:

       1,方法增加静态锁

2,接口方法内部,启动一个子线程,用于开启一个事务,获取序列号,然后+1提交数据库,提交事务,子线程执行结束。(在子线程的t.start()后,加了t.join())

时间: 2024-10-12 00:18:11

JAVA多线程下,获取递增的序列号的相关文章

普通int值在多线程下的递增操作

Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,其中一部分如下:  java.util.concurrent.atomic.AtomicBoolean;  java.util.concurrent.atomic.AtomicInteger;  java.util.concurrent.atomic.AtomicLong;  java.util.concurrent.atomic.AtomicReference;  下面是一个对比 AtomicInteger 与 普通 int

java多线程下如何调用一个共同的内存单元(调用同一个对象)

1 /* 2 * 关于线程下共享相同的内存单元(包括代码与数据) 3 * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作. 4 * 对于Thread(Runnable target)构造方法创建的线程,轮到它来享用CPU资源时. 5 * 目标对象就会自动调用接口中的run()方法 6 * */ 7 8 /* ----------------举例子------------------- */ 9 10 /* 11 * 使用Thread类创建两个模拟猫和狗的线程,猫和狗共享房屋中的一桶

java多线程下的所的概念

锁和synchronized关键字     为了同步多线程,Java语言使用监视器(monitors),一种高级的机制来限定某一 时刻只有一个线程执行一段受监视器保护的代码.监视器的行为是通过锁来实现的,每一个对象都有一个锁.    每个线程都有一个工作内存,在里面存放从所有线程共享的主内存里拷贝来的变量.为了访问一个共享的变量,一个线程通常先要获得一个锁并刷新它的工作内存,这将共享的值从主内存被拷贝到工作内存.当线程解锁时将会把工作内存里的值写回主内存.&n bsp;   一个线程能多次获得对

Java-No.01 Java Linux下获取服务器ip地址

1.在window下获取本机ip地址 InetAddress inet = InetAddress.getLocalHost();   System.out.println("本机的ip=" + inet.getHostAddress()); 该方法在linux下获取到的ip为127.0.0.1,原因是你linux服务器上hosts配置了 127.0.0.1 localhost 可以修改hosts下将127.0.0.1改成你的本机真实ip地址 2.linux下代码获取本机ip地址 pu

[Java] 多线程下生产者消费者问题的五种同步方法实现

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题. 生产者消费者模式的优点 - 解耦 - 支持并发 - 支持忙闲不均 解决方法可分为两类: (1)用信号量和锁机制实现生产者和消费者之间的同步: - wait() / notify()方法 - await() / signal()方法 - BlockingQueue阻塞队列方法 - Semaphore方法 (2)在生产者和消费者之间建立一个管道.(一般不使用,缓冲区不易控制.数据不易封装和传输) - PipedInputStream

java多线程下模拟抢票

我们设置三个对象分别同时抢20张票,利用多线程实现. 1 public class Web123506 implements Runnable{ 2 private int ticteksNums=20;//票数 3 4 @Override 5 public void run() { 6 while (true){ 7 if(ticteksNums<0){ 8 break; 9 } 10 /* try { 11 //睡眠 12 Thread.sleep(200); 13 } catch (Int

HashMap简单源码及多线程下的死循环

主要记录hashMap的一些基本操作源码实现原理以及多线程情况下get()操作的死循环引发原因 一.hashMap简介 1.hashMap集合的主要属性及方法 (默认初始化容量)DEFAULT_INITIAL_CAPACITY = 16 (默认最大容量)MAXIMUM_CAPACITY = 1 << 30 (默认加载因子)DEFAULT_LOAD_FACTOR = 0.75f (Entry数组)Entry[] table (Entry实例的数量)size put(K key, V value)

Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger

前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲过的线程池.BlockingQueue都是在java.util.concurrent下的组件,Timer虽然不在java.util.concurrent下,但也算是.后两篇文章将以例子的形式简单讲解一些多线程下其他组件的使用,不需要多深刻的理解,知道每个组件大致什么作用就行. 本文主要讲解的是Cou

java从基础知识(十)java多线程(下)

首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 每个线程都有自己的工作内存,存有主内存中共享变量的副本,当工作内存中的共享变量改变,会主动刷新到主内存中,其它工作内存要使用共享变量时先从主内存中刷新共享变量到工作内存,这样就保证了共享变量的可见性. 可