javaweb多线程并发如何处理?如何保证多线程安全?

大家好,感谢大家可以讨论、回答本帖。本人菜鸟一个,也有多年没开发了,也没实际开发过,我所问的是按照我自己的个人想法来提问的,所以很多问题说的不专业,还请谅解。

    任务需求:

任务管理系统,是一个系统任务平台。
所遇到的问题是。在这个任务系统中有N个任务,那么也有N个人来抢任务做。
最开始的任务状态是0(没有进行操作)1表示已经进行操作。

任务流程
---->>
客户端请求任务----->>系统查询是否有状态为0的任务----->查询到状态修改为1----->>x返回给客户端。

那么问题在来了,由于系统的并发量很大。当第一个请求拿到一个为0的任务后还没来得及修改第二个或者第N个请求也拿到了相同的任务,那就造成了重复任务了。

解决方法:
synchronized :
效率极低,容易造成系统崩溃。

 缓存欲加载,提前加载好预定数量到内存中,查询直接查询缓存数据
        缺陷:无法做分布式,或者来说 做分布式比较麻烦。


    想请教各位大佬,这种业务应该怎么做。想了很久也没想出好的方案,该系统考虑做分布式。


    该系统一秒可能会有几千个请求。

7个回答

用一个任务队列保存所有任务,那么无论哪个线程拿到任务后将任务弹出队列,其他线程也就不会拿到重复任务,而且不需要去查询与修改状态。这样的同步队列可以自己去实现,也可以直接使用Concurrent包中提供的,建议使用jdk提供的,这样效率一般是没有问题的,如果还觉得效率不够,可以自己去实现队列,参考CAS或者其他的无锁思想

可以用阻塞队列等存放任务,然后线程池从里面拿任务来处理。阻塞队列符合happens-before规则。所以只会一个线程处理一个任务

xiao851671244
yeskpd 意思就是,先查询出数据到集合中,请求过来的时候查询缓存有没有数据,没有数据就等待数据?
大约 2 年之前 回复

从你的描述来看,用 synchronized 完全可以解决你的问题。
至于你说的所谓“效率极低”,那可能是你自己实现不好导致的。鉴于你也没有给出具体实现来,这个问题暂时也无法诊断。
一般来说,用了 synchronized,性能肯定有所降低,这是并发控制的本质所决定的。
所谓同步,其实就是在某些关键地方,让并发访问变成串行访问,以此保证数据的一致性。
它会降低一定的效率,但不应该是“极低”,极低只能说明你的控制有问题。

ShawGolden
Golden_国栋 回复yeskpd: 好吧,我也不清楚你的具体情况,你看看能不能用信号量来做下控制
大约 2 年之前 回复
xiao851671244
yeskpd synchronized 中 执行查询和修改 数据多的话 可能500毫秒还是要,并发一下过来,可能千把个线程。导致后面的要等很久,搞不好系统也会崩溃
大约 2 年之前 回复

可以使用redis做缓存,很多秒杀就是这样做的

xiao851671244
yeskpd 也就是把数据放在redis嘛,但是我还是要修改状态,那还是又回来了起点,如果状态还没修改过来又被一个其他线程拿到了呢?
大约 2 年之前 回复

java中的并发同步安全性并不一定要用synchronized的,这个锁粒度太大,这个得看具体取舍,concurrent包里还有很多方案。redis可能会造成同步延时,
看你具体需求对这个要求是不是很高。有时候重复任务影响也不大。。。。。。。。。。。。。。。积分给我吧哈哈

xiao851671244
yeskpd 这个任务,都是要钱的,所以不能重复,我简单的看了下那个包,内容有点多还没想到怎么应用,如果使用concurrent包中的工具,他可以用于分布式部署么?
大约 2 年之前 回复

建议使用消息队列MQ进行处理,既可以实现并发异步访问,又可以实现逐个处理的效果。

是web服务吗,为啥不直接用springmvc之类框架呢,任务直接入库,请求来了处理任务,对应记录状态置1

xiao851671244
yeskpd 恩,现在就是解决并发问题,不然会重复
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java 多线程安全机制
什么是多线程安全,java中有哪些机制可以保证线程安全
多线程三(多线程数据安全问题与三种解决方式)
最近在做与下载相关的APK的时候,需要用到多线程的一些知识,之前用的不是很多很深入,所以现在重新翻出来学习并且记录一下,这部分内容目前准备三个阶段完成;第一部分是一些基本概念与多线程几种常见的实现方式;第二部分是线程相关的一些方法以及使用过程中的一些注意事项;由于学习的调整,内容安排上优点变化,所以第三部分先简单说一下多线程中数据安全问题与相应的解决方法。 1,多线程数据安全问题引入...
Java多线程并发编程要保证线程安全的3个要素
当多个线程要共享一个实例对象的值得时候,那么在考虑安全的多线程并发编程时就要保证下面3个要素:原子性(Synchronized, Lock)有序性(Volatile,Synchronized, Lock)可见性(Volatile,Synchronized,Lock)当然由于synchronized和Lock保证每个时刻只有一个线程执行同步代码,所以是线程安全的,也可以实现这一功能,但是由于线程是同...
Netty的并发编程实践4:线程安全类的应用
在JDK1.5的发行版本中,Java平台新增了java.util.concurrent,这个包中提供了一系列的线程安全集合、容器和线程池,利用这些新的线程安全类可以极大地降低Java多线程编程的难度,提升开发效率。 新的并发编程包中的工具可以分为如下4类。 ◎   线程池Executor Framework以及定时任务相关的类库,包括Timer等。 ◎   并发集合,包括List、Queue
Java多线程有哪几种实现方式?Java中的类如何保证线程安全?请说明ThreadLocal的用法和适用场景
Java多线程有三种实现方式:(1)继承Thread类,重写run函数;(2)实现Runnable接口,重写run函数,开启线程:Thread t=new Thread(对象)//创建线程对象(3)实现CallAble接口,重写call函数,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务Callable和Runnab...
【Java之Servlet(二)】servlet是单例多线程,以及多线程下如何保证线程安全
Servlet 单例多线程 1、Servlet如何处理多个请求访问? 答:Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例); 2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的设置线程池中线程数目,初始
多线程(三)--线程安全与锁
 一、引言:         JAVA 是一个多线程并发的语言,现在只要有点经验的JAVA程序员,对于多线程、并发等词汇相信并不陌生,但是对于具体的运行原理,很多也都没深入,这里我也分享一部分自己的经验,主要对于线程安全以及锁的一些机制原理,进行介绍。关于线程的基本知识点,前面也说过了,可以了解一下。   1.1 什么是线程安全?       这里我借“JAVA 并发实践”里面的话:当多...
并发编程 — 判断线程安全
[size=medium] 并发编程系列文章: 初解线程池:[url]http://ray-yui.iteye.com/blog/2072463[/url] 详解线程池:[url]http://ray-yui.iteye.com/blog/2075311[/url] 并发数据类型:[url]http://ray-yui.iteye.com/blog/20...
java多线程安全性
原子性,可见性,有序性 java多线程安全性的核心就在于,站在单个线程的角度,如何保证自己的数据不会被其他线程破坏。在在多线程的角度,每个线程对共享数据的操作都是有效的,不会被覆盖,修改。实现起来就是这三个特性,Atomic,concurrency包等java多有的多线程操作都是在这个三个原则上面展开的,核心思想。 原子性 原子性:顾名思义,不可分割,A线程在处理a变量的时候不会...
获得更好并发和线程安全性的场景和解决方案
适用场景:                你需要从数据库加载股票交易的安全代码并且考虑到性能进行了缓存。这些安全代码需要每30分钟刷新一次。在这里缓存数据需要一个单独的写线程进行生成和刷新,并且被若干读进程进行读取。这种情况下,你又要如何来保证你的读写方案做到良好的扩展和线程安全呢?                       解决方案:java.util.concurrent.lock...
高并发环境下线程安全的单例模式(最全最经典)
在所有的设计模式中,单例模式是我们在项目开发中最为常见的设计模式之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧!什么是单例模式?在文章开始之前我们还是有必要介绍一下什么是单例模式。单例模式是为确保一个类只有一个实例,并为整个系统提供一个全局访问点...
java并发之如何解决线程安全问题
× 资讯 安全 ...
java多线程(6)--多线程的安全问题总结
1、多线程安全问题分析   多线程安全问题原因是在cpu执行多线程时,在执行的过程中可能随时切换到其他的线程上执行。      在以上红色选中的三个部分,线程都有可能进行切换。只要cpu在这个三个地中的任何地方切换了,都可能导致错误数据出现,线程的不安全因素就有了。     造成错误数据的原因是多个线程可能出现同时访问num的情况。而任何一个线程在访问num的过程中都可以切换到其他的线程
实现多线程安全的3种方式
1、先来了解一下:为什么多线程并发是不安全的?  在操作系统中,线程是不拥有资源的,进程是拥有资源的。而线程是由进程创建的,一个进程可以创建多个线程,这些线程共享着进程中的资源。所以,当线程一起并发运行时,同时对一个数据进行修改,就可能会造成数据的不一致性,看下面的例子: 假设一个简单的int字段被定义和初始化: int counter = 0; 该counter字段在两个线程A和B
JAVA多线程不安全问题解决方案(多线程并发同一资源)。
引例:吃苹果比赛,3个人同时吃50个苹果,谁先拿到谁就吃,每个哦ing过都有编号。 问题: 多线程同时执行的时候可能出现不安全问题 当3个人同时拿到一个苹果,他们的编号就一样,当时主要看是谁先吃掉苹果 除非拿到苹果和吃掉苹果是连续同步执行,没有其他的线程干扰 方案一: 设置同步代码块(同步锁)。 synchronized(共享资源){ 同步执行代码; } class App
C++多线程安全类的问题
我们是多么渴望各种C++类都是多线程安全的,然而一旦涉及到对象间的交互,这样的渴望可能就只能是奢望了。下面,我们以设计一个双向链结点为例,看看要使其多线程安全将会带来一些什么问题。 class DoublyLinedNode{        DoublyLinedNode* pPrevNode_;        DoublyLinedNode* pNextNode_;   public:
分布式环境下,怎么保证线程安全
避免并发 在分布式环境中,如果存在并发问题,那么很难通过技术去解决,或者解决的代价很大,所以我们首先要想想是不是可以通过某些策略和业务设计来避免并发。比如通过合理的时间调度,避开共享资源的存取冲突。另外,在并行任务设计上可以通过适当的策略,保证任务与任务之间不存在共享资源,比如在以前博文中提到的例子,我们需要用多线程或分布式集群来计算一堆客户的相关统计值,由于客户的统计值是共享数据,因此会有并发...
Spring单实例、多线程安全、事务解析
原文:http://blog.csdn.net/c289054531/article/details/9196053 引言:     在使用Spring时,很多人可能对Spring中为什么DAO和Service对象采用单实例方式很迷惑,这些读者是这么认为的:     DAO对象必须包含一个数据库的连接Connection,而这个Connection不是线程安全的,所以每个DAO都
关于多线程并发:每个开发人员都应了解的内容 .
本文讨论:   多线程和共享内存线程模型争用及并发访问如何能够打破不变量作为争用标准解决方案的锁定何时需要锁定如何使用锁定;理解开销锁定如何能够各行其道   十年前,只有核心系统程序员会担心在多个执行线程的情况下编写正确代码的复杂性。绝大多数程序员编写的是顺序执行程序,可以彻底避免这个问题。但是现在,多处理器计算机正在普及。很快,非多线程程序将处于劣势,因为它们无法利用可用
面试中多线程并发处理方式?
1.首先我们要搞清楚什么是并发 什么是并行? 概念:在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。简单讲在某一个时间中,一...
java多线程下,并发更新数据时存在的安全问题,以及解决方案。
在实际项目中,往往会存在许多并发安全问题,以及并发访问效率问题。 比如,在多个用户同时更新同一条数据的时候,往往会出现线程安全问题,实际保存的数据和预期的并不相符。面对这种问题很多人第一时间会想到内置锁---->synchronized关键字,将方法体或者代码块锁住保证线程执行的同步。这样就能从根本上解决并发的线程安全问题。 但是,如果直接使用...
.net core 并发下的线程安全问题
抱歉,其实内容并不如题!!!背景(写测试demo所出现的异常,供大家学习与拍砖):.net core webapi项目,做了一个授权的filter(真正的生产项目的话,J...
用于解决多线程安全问题的三种方式
用于解决多线程安全问题的方式: 1. 同步代码块 (隐式锁) 2. 同步方法(隐式锁) 3. 同步锁 Lock( jdk 1.5 后)  注意:是一个显示锁,需要通过 lock() 方法上锁,必须通过 unlock() 方法进行释放锁 下面举一个售票例子: 1)同步代码块 package com.lxj.juc; public class TestSync { public stat...
高并发下的线程安全实现——互斥同步
高并发下的线程安全实现——互斥同步好久没来csdn上写博客了,去年(16年)来到杭州后,忙得沉淀的时间都没有了,这段时间空闲下来,慢慢补上! 线程允许多个活动同时进行,并发下有很多东西可能出错,比如数据错误,程序运行异常。很多时候这些错误以及异常在测试中都很难重现,他们可能是间歇性的,且与时间相关,程序的行为在不同的VM上可能表现根本不同。所以设计一个线程安全的程序就显得尤为重要,尤其是在高并发环
Android多线程之线程安全详解
1 线程和进程的区别 首先一点,进程是包含线程的。就是一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。而一个运行的软件是可以包含多个进程的。线程是码顺序执⾏行行下来,执⾏行行完毕就结束的一条线。 线程和进程的具体区别如下: 进程是资源分配的最小单位,线程是程序执行的最小单位。 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址...
Java线程并发与安全性问题详解
同步异步-线程并发安全问题 什么是并发 线程并发安全问题 同步与异步 同步锁 生产者与消费者模型 什么是并发 想要解决线程并发安全问题,那首先要弄清楚什么是并发? - 线程的并发原理: - 我们先举一个例子,如果让你同时吃西瓜和米饭,你会怎么吃呢?我们来模拟一下:1)吃一口梨,吃一口米饭2)吃几口梨,吃几口米饭3)吃完梨再吃米饭。当然了,具体怎么吃要看你的心情,并...
确保线程安全的几种方法
本文首先对线程进行简单的介绍,然后介绍几种保证线程安全的方法。
如何保证单例模式在多线程中的线程安全性
如何保证单例模式在多线程中的线程安全性         对大数据、分布式、高并发学习必须要有多线程的基础。这里讨论一下如何在多线程的情况下设计单例模式。在23中设计模式中单例模式是比较常见的,在非多线程的情况下写单例模式,考虑的东西会很少,但是如果将多线程和单例模式结合起来,考虑的事情就变多了,如果使用不当就会造成灾难性的后果。所以如何使单例模式在多线程中是安全的显得尤为重要。
Java中如何保证线程安全性
一、线程安全在三个方面体现1.原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);2.可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);3.有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。接下来,依次分析。二、原子性-...
SSL多线程安全问题
项目原因,代码实现证书控制,网上很多介绍使用System.setProt。。。等方法,后突然想到应该会有多线程安全问题,应为我方系统可能多个证书,故在iteye咨询大牛帮忙,详细见:  http://www.iteye.com/problems/94392 后按照一个那个朋友介绍,使用代码读取文件方式加载ssl,详细见: SSLContext ctx = httpsMap.get(prj...
Java并发编程规则:原子变量实现线程安全
判定规则: 如果一个类中存在变量,并且此变量的操作不是原子操作,那么这个类就是非线程安全的类。在线程产生竞争条件的情况下,多线程访问导致原子性不可保证。 常见原子变量: 在java.util.concurrent.atomic包下还有很多类,使用这些类可以保证对这些类的诸如“获取-更新”操作是原子性的,从而避发生竞争条件。常见的原子变量: AtomicBoolean //可以用原子
【多线程】如何保证线程安全
一、线程安全等级       之前的博客中已有所提及“线程安全”问题,一般我们常说某某类是线程安全的,某某是非线程安全的。其实线程安全并不是一个“非黑即白”单项选择题。按照“线程安全”的安全程度由强到弱来排序,我们可以将java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。          1、不可变       在java语言中,不可变的对象一定...
浅谈android的线程安全和handler处理
android的UI操作不是安全的,同时也只有主线程才能操作UI,同时主线程对UI操作有一定的时间限制(最长5秒)。为了能够作一些比较好使的操作(比如下载、打开大文件等),android提供了一些列机制。线程安全:如果你的代码所在的进程中又多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也喝预期的是一样的,就是线程安全的,或者说:一
浅析设计高可用数据库连接池(多线程)的核心要点与技术原理以及处理线程的安全问题
前不久有俩个盆友和我探讨这些问题,我做了个简单的总结分享给打架,明天就是国庆了祝大家玩的开心,主要分享设计数据库连接池原理以及要处理关键点,本文只挑选某一种实现方式来简单阐述,暂不涉及事务相关。关于事务传播行为和跨库事务(包括2PC和TCC),过段时间再做分享! 那我们先引出问题,就从没有数据库连接池的时候说起吧(图就不画了,网上截一个)!!! 缺点:首先,每一次web请求都要建立一次数据...
HashSet遍历时保证线程安全
知识前提:HashSet是线程安全集合,但仅限于多个线程同时对一个HashSet集合修改。 遇到的问题:多个线程同时对集合进行修改时没有遇到任何为题,但是当有一个线程在遍历的过程中对元素进行新增和删除时,此时是线程不安全的。 解决方案:其实很简单,我们只要保证遍历和集合修改时有一个互斥锁就能保证线程安全。 代码如下: public class BlockingHashSet
Java多线程线程安全实现方式
线程安全就是要保证数据的高度一致性和准确性,但不是一定要加锁才是线程安全性,只要代码里没有变量互串,线程之间互不影响,就是线程安全的。 要了解线程安全,可以先看一下线程不安全是怎样的一种现象。public class TreadNoSafeDemo { public static void main(String[] args) { new ThreadNoSafeTest(
多线程与高并发编程之基础知识(上)
前言: 使用多线程,第一步就是需要知道如何实现自定义线程,因为实际开发中,需要线程完成的任务是不同的,所以我们需要根据线程任务来自定义线程,那么,JDK提供了三种自定义线程的方式,供我们实际开发中使用,来开发出符合需求的多线程程序! 以下给出线程的三种实现方式,并且对每种实现的优缺点进行分析,最后对三种实现方式进行总结; 方式一:继承Thread类,重写run方法 package com.thr...
JAVA多线程之间实现同步+多线程并发同步解决方案
一、什么是线程安全问题 为什么有线程安全问题?       当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作时不会发生数据冲突问题。案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。/** * 需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 * Crea...
Qt 多线程之可重入与线程安全
Qt 多线程之可重入与线程安全是本节要介绍的内容。在Qt文档中,术语“可重入”与“线程安全”被用来说明一个函数如何用于多线程程序。假如一个类的任何函数在此类的多个不同的实例上,可以被多个线程同时调用,那么这个类被称为是“可重入”的。假如不同的线程作用在同一个实例上仍可以正常工作,那么称之为“线程安全”的。 大多数c++类天生就是可重入的,因为它们典型地仅仅引用成员数据。任何线程可以在类的一个
多线程与高并发基础一(超发--悲观锁,乐观锁)
关键词: 线程,同步,单例,高并发,高访问,死锁 一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态。我们现在一起来讨论下,优化的思路和方法哈。 1. 请求接口的合理设计 一个秒杀或者抢购页面,通常分为2个部分,一个是静态的H
相关热词 c#panel增加滚动条 c#中生成的dll文件 c# 模板类 c# 截取txt文本内容 c# 内存 占用 c#时间格式化 不带- c#替换字符串中指定位置 c# rdlc 动态报表 c# 获取txt编码格式 c#事件主动调用