java多线程同步问题

假设一个用户有100元,他有10次消费记录,
都是11元,用(线程池)10个线程同步处理10个消费记录,在用户
余额允许的情况下,处理一个从用户余额中扣除本次消费的费用,
消费成功返回1,消费不成功返回0,最后结算用户的余额,以及返回
多少个1,多少个0。 如果返回的全部都是1,而且用户余额为负数了,
那怎么解决当用户余额不够了那次消费就不能处理了,那么返回0,
同样考虑用多线程同步来处理

3个回答

不知道对不对,拿出来看看吧

用户账号
[code="java"]public class User {
public static int count = 100;

public static void set(int co) {
    count = co;
}

public static int get() {
    return count;
}

}[/code]
消费
[code="java"]public class UseThread implements Runnable {

@Override
public void run() {
    synchronized (User.class) {
        int count = User.get();
        if (count > 11) {
            System.out.println("足" + count);
            User.set(count - 11);
        } else {
            System.out.println("不足" + count);
        }
    }
}

}[/code]
测试
[code="java"] /**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i <= 9; i++) {
UseThread cc = new UseThread();
Thread thre = new Thread(cc);
thre.start();
}
}[/code]

你应该加一个线程锁,修改之前先锁定,修改之后释放锁。

这个操作应该是数据库层面的吧,给余额字段价格非负的约束即可,10个线程同时操作余额,会有几个线程抛异常,表示没有成功。
不妨把你的场景说详细点,我可以给你写点代码。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java多线程同步问题
        何谓同步问题呢?就是比如银行开了一个账户,那么如果我在ATM机上执行两个操作,分别是存入了200元,然后取出100元,原来账户中假设有1000元,那么此时操作完上述两步骤之后账户中总共有1100元。在银行账户上操作只有等当前步骤操作完才能进行下一个步骤,这就是同步。如果不同步呢,那么可能存入钱的时候同时取了钱,可能取完钱账户数据更新为900元,那么这就是因为不同步产生的脏数据。接下...
请教JAVA多线程同步的问题
1.进程阻塞在wait()后,当被恢复时,应该从哪一句开始继续运行?rn2.notify()的具体工作机制是怎样的?好象在SCR里看不到它的代码。rn3.notify()唤醒的,是相同对象产生的那些进程,那么用JAVA如何实现唤醒不同对象产生的进程?比如生产者与消费者问题,生产者进程如何唤醒消费者进程?rn多谢!
JAVA多线程同步问题
哪位高手告诉我为什么下面代码运行时只有第一个线程rn就是只有售票点Arn而B,C没打印rnclass Demo implements Runnablernrn private int ticket = 10 ;rn public void run()rn rn while(ticket>0)rn rn // 加入同步块rn synchronized(this)rn rn if(this.ticket>0)rn rn tryrn rn Thread.sleep(100) ;rn rn catch (Exception e)rn rn rn System.out.println(Thread.currentThread().getName()+" --> 卖票:"+this.ticket--) ;rn rn rn rn rn;rnpublic class ThreadDemo15rnrn public static void main(String args[])rn rn Demo d = new Demo() ;rn Thread t1 = new Thread(d,"售票点 A") ;rn Thread t2 = new Thread(d,"售票点 B") ;rn Thread t3 = new Thread(d,"售票点 C") ;rnrn t1.start() ;rn t2.start() ;rn t3.start() ;rn rn;
java 多线程同步问题
我有一个函数,提供给客户调用rn这个函数内容是发短信,然后扣除客户对应的费用,取客户当前余额减发送数.rnrn问题出来了:rn客户写了多线程的程序调用这个函数发短信,取客户当前余额经常被取重复.rn请问,我要怎么样改我的这个函数才能实现线程同步!rnrn(我这样描叙不知道大家能不能看懂,如果需要进一步说明请留言在后面)rn一定结帖!
java中多线程同步的问题?
做了一个聊天服务器,打开一个端口进行监听。当用户连接请求到达以后,服务器开一个新的线程来处理。为了保证一个连接用户说话后,所有连接用户都能看到,我使用了输出流数组,通过循环方式向所有用户进行广播.但是有时服务器端会出现异常情况,我估计是每个用户的线程不同步造成的,请问应如何处理这个问题,谢谢!
java多线程同步的问题
小测试,如何实现变量ticket的同步nnn```nprivate int ticket = 100;npublic void run()nn while(ticket > 0 ) n System.out.println(ticket+" is saled by "+n Thread.currentThread().getName());n ticket--;n tryn n Thread.sleep(200);n n catch (InterruptedException e)n n e.printStackTrace();n n nn```nn
Java多线程同步问题求助
下面的代码执行后肯定是有问题的,我希望显示的结果是在赋值前value的值是1,2,3,4....10(顺序乱没关系,但不能重复和漏了),重新赋值后自然都是8888了。搞不定啊搞不定,高手求助rnrn代码如下:rn[code=java]rnpublic class ThreadMain rn Map m = new HashMap();rn rn void putA(A a)rn m.put("k", a);rn rn rn void main(A a) rn int i = 10;rn while(i > 0) rn B b = new B();rn b.setValue(i);rn a.setB(b);rn rn R r = new R(m);rn Thread t = new Thread(r);rn t.start();rn rn i--;rn rn rn rn public static void main(String[] args) rn ThreadMain d = new ThreadMain();rn A a = new A();rn d.putA(a);rn d.main(a);rn rnrnrnclass R implements Runnablern Map m;rn rn R(Map m)rn this.m = m;rn rnrn public void run() rn A a = m.get("k");rn System.out.println("before set A.b.value is:"+a.getB().getValue());rn rn B b = new B();rn b.setValue(8888);rn a.setB(b);rn rn System.out.println("after set A.b.value is:"+a.getB().getValue());rn rnrnrnclass A rn private B b; rn public B getB() rn return b;rn rnrn public void setB(B b) rn this.b = b;rn rnrnrnclass Brn private int value;rnrn public int getValue() rn return value;rn rnrn public void setValue(int value) rn this.value = value;rn rnrn[/code]
Java多线程同步的问题
今天去面试的时候,面试官问我Java实现多线程同步除了用synchronized之外还有什么办法(因为synchronized开销比较大),我想不到还有什么办法,请问各位大大,到底还有什么办法实现?
Java 多线程同步、死锁问题
/** * @author StormWangxhu * @version 创建时间:2017年11月8日 下午15:19:46 * */1、同步代码块当多个线程使用同一个共享资源时,可以将处理共享资源的代码放在一个使用synchronized关键字来修饰的代码块中,这个代码块被称作同步代码块。语法格式如下:synchronized (lock){ 操作共享资源代码块 }解释: lock是一个锁对
java多线程同步
多线程的线程同步机制实际上是靠锁的概念来控制的。那么在Java程序当中,锁是如何体现的呢?让我们从JVM的角度来看看锁这个概念:在Java程序运行时环境中,JVM需要对两类线程共享的数据进行协调:1)保存在堆中的实例变量2)保存在方法区中的类变量(静态变量)     这两类数据是被所有线程共享的。(程序不需要协调保存在Java 栈当中的数据。因为这些数据是属于拥有该栈的线程所私有的。)在j...
java 多线程同步
/*  * 多线程同步功能 两个线程同时向共享数组中添加数,且每个加三个时结束  * */ package Demo4_1; public class Test1_4 {          public static void main(String[] args) {         //TickeyWindow tw = new TickeyWindow();
Java多线程同步
代码,求大神优化rn[code=java]rnrnimport java.util.HashMap;rnimport java.util.Map;rnimport java.util.Random;rnrnpublic class TestImpl implements Testrnrn private static Map users = new HashMap();rn @Overridern public void update(int id) rnrn String lock = users.get(id);rn if(lock == null) rn lock = id + "";rn users.put(id, lock);rn //同一个Id可能多次这里可能会执行多次,求大神优化这里或者有别的实现方式?rn System.out.println("-------------------");rn rn synchronized (lock) rn Random random = new Random();rn int result = random.nextInt(10);rn System.out.println("start lock id :" + id + ", will lock " + result +" second!");rn try rn Thread.sleep(result * 1000);rn catch (InterruptedException e) rn e.printStackTrace();rn rn System.out.println("end lock id :" + id);rn rn rn rnrn public static void main(String[] args) rn Random random = new Random();rn for (int i = 0; i < 10; i++) rn int result = random.nextInt(1);rn rn TestThread testThread = new TestThread(result);rn new Thread(testThread).start();rn rn rnrn[/code]rn[code=java]rnrnrnpublic class TestThread implements Runnablernrn private int id;rn rn public TestThread(int id) rn super();rn this.id = id;rn rnrn @Overridern public void run() rn new TestImpl().update(id);rn rn rnrnrn[/code]rn[code=java]rnrnpublic interface Test rnrn public void update(int i);rnrn[/code]rnupdate(int id)这个方法就是现实更新用户信息,但是想同一个用户(Id相同)只能一个线程访问,不同用户不受此限制,比方说有线程A更新id=1,线程B更新id=1,线程C更新Id=2;那么当A线程先进来时,B线程只能等待,而C线程不用等待
JAVA多线程同步
同步代码块 synchronized(对象) { 需要同步的代码; } 例程 package cn.wf.thread1; /** * 多线程同步:同步代码块 * @author wf * */ public class Thread_Test implements Runnable { private int tickets = 5; @Override public void...
JAVA——多线程同步
java使用wait和notify进行线程的同步,在网上有很多教程了 这里说明一下实现时候需要注意的地方 题目:两个线程,一个线程存数据(name, sex),另一个线程取数据。 交替的打印出存取过程。 - 要求存一条取一条的打印出数据。 package multithread3; import java.util.*; public class Demo { final stati...
java多线程同步问题,跪求帮忙
问题:有两辆汽车,其中一辆停止不动,另一辆向前一辆靠近,如果它们之间的距离小于1,那么停止的汽车就发出警笛声,如果距离越小,声音就越大,用java编程实现。
java日志类多线程同步问题!
如题:现在要做一个日志工具类.主要是保存系统生成的日志.rn现在遇到多线程访问时不同步的问题.rnrnKLinkLog.initKingLog("c://kinghi1.log", KLinkLog2.DEBUG, "c://log", 100);rnKLinkLog.writeLog(KLinkLog2.NORMAL, "kinghi-test1-"+this.hashCode());rninitKingLog和writeLog都是synchronized的.rnrn假如出现当一个线程写C://kinghi1.log.而另一个线程写C://kinghi2.log时.rn 出现的线程又写到了kinghi1.log.也写到了kinghi2.logrnrn代码如下:rnrnpublic class KLinkLog rn public final static int DEBUG = 3;rn //日志名rn private static String logName = "./Kinghi.log";rn //日志级别rn private static int level = 2;rn //备份路径rn private static String bakPath = null;rn //日志文件最大大小rn private static int maxSize = 100;rn //日期格式化rn private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.HH.mm.SSS");rnrn private KLinkLog() rnrn rnrn public static synchronized void initKingLog(String logName,int level,String bakPath,int maxSize)rn rn //参数检测rn if(level == KLinkLog.NONE || level < KLinkLog.NONE || level > KLinkLog.DEBUGrn || logName == null ||logName.equals("") rn || maxSize <=0)rn rn return;rn rn elsern rn KLinkLog.logName = logName;rn KLinkLog.level = level;rn KLinkLog.bakPath = bakPath;rn KLinkLog.maxSize = maxSize;rn rn rnrn rn/**rn * 向日志中写日志rn * @param level 日志级别rn * @param message //写入消息rn * @return 返回1为没有写入.返回0为写入成功rn */rn public static int writeLog(int level, String message)rn rn //.............I/O操作rn rnrnrn解决100分送上.
请教java中的多线程同步的问题!
请教高手,如何编写一个安全高效的多线程程序.rnsynchronized 关键字 和 wait() ,notify(),notifyall() rn该如何使用?( 可否给出一个简单的实例)rn小弟新近才从c的多线程转到java的多线程, 深感java 的多线程程序的确比 C方便,rn但 c 中编程的习惯还一时没有改过来, 尤其是互斥量及信号量的使用在两种语言中有很大的区别, 故情高手指点一二? 最好还是能给我一个 简单的例程. 在此多谢勒!rnrnmail : wugng@yeah.net
Java synchronized 多线程同步问题详解
版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009225706 1. 引言 在 Java 多线程编程中,我们常需要考虑线程安全问题,其中关键字 synchronized 在线程同步中就扮演了非常重要的作用。 下面就对 synchronized 进行详细的示例讲解,其中...
多线程同步的问题?
我想实现一种功能:分配一块内存区域,在一个线程访问或使用的时候,别的所有将使用该内存区域的线程就排队等待。我看了Windows的多线程同步的书,可那些对象可以实现代码级的多线程同步,就是说给定的代码是固定的,然后别的线程在使用内存区域的时候可实现排队同步。在WINDOWS编程中有没有数据级的多线程同步方法,就是说在一个线程使用一个内存区的时候别的线程就使用不了该区域,同时各线程对内存数据区的处理方法可以自定,可以变化,不受“类”方法的限制。rnrn打个比方:mov 00000001H,01H(在0~4k页中)rn mov 00000002H,02Hrn mov 00000003H,03Hrn mov 00000004H,04Hrn 以上为一个线程的代码,这时另一个线程就会等待这一段代码的执行完毕后(不会被系统切换而使以上代码的完整性被破坏),再执行另一段代码:rnadd 00000001H,02Hrnadd 00000002H,05Hrnadd 00000003H,03Hrnadd 00000004H,01Hrn
多线程同步问题
[code=Delphi(Pascal)]rntypern StatRun = record //定义一个结构rn Flag: Boolean ;rn time: DWORD ; //由GetTickCount得到.rn end;rnrnrntypern TProtectThread = class(TThread)rn privatern protectedrn procedure Execute ; override ;rn publicrn RunPLth, //A线程写这个变量rn RunTeamth, //B线程写这个变量rn Runsend, //C线程写这个变量rn RunHPMPth: StatRun ; //D线程写这个变量rn end;rn[/code]rnrnrnTprotectThread 线程作为一个守护线程, 监视 A b c d 四个线程的运行状态, 如果发现其中某个线程异常终止了或长时间无响应, 就调用 TerminateThread 函数 强制结束一次, 然后重新create 此线程实例并运行.rnrnA , B, C, D 四个线程利用上面代码中 TprotectThread 类中的变量写入标记和记录的时间, TprotectThread 线程就读取这些变量来判断 A, b, c, d 线程是否运行正常. rnrn所有线程都是循环的运行, 中途无终止线程事件. sleep(500) 左右.rnrn那么请问:rn(1) 有没有更好的办法可以监视 a, b, c, d线程的运行状态呢? 请指点.rnrn(2) 我上面的方法是否也可行? 有没有错误或隐患? rnrn(3) 如果按上述的方法, 那不同线程写入和读取变量时要不要作线程同步? rn
多线程同步的问题
多个(N个, 数量比较大, 而且运行期间变化)work线程, 他们互相没关联, 即他们访问的资源互相不影响。rnrn一个查询线程, 他查询这些work线程中共享数据的状态。 对于这些数据在查询过程和work中是需要同步访问的。rn但是查询是一个极罕见的工作, 并且也是瞬间完成, rn希望达到如下效果rn查询的时候, 所有的work都阻塞到这些共享数据的访问上, 等查询完毕后继续访问rn只要不是在查询中的话, work是可以互不影响的工作。rnrn原先的想法是每个共享资源都设置一个同步对象, 让每一个work都和查询线程同步。 但感觉这样rn占据了太多的内核资源。rn换句话说, 现在就是希望, 能存在一个一对多的同步对象。rn在访问这个同步对象的时候, 要么a在访问, 要么b的集合任意一个在访问, 但集合b不要求他们有冲突。rnrnrn曾想过一种方法, 就是定义一个初始数量(M)特别大的Semaphore, 能满足N的最大数量的同时访问,(M>=N)rn让query对于Semaphore的需求量位M, 这样只有所有的work都没访问他们自己的和query共享的临界资源的时候rn才能进行query, 并且在query之前发送了一个resetevent让所有的work在下次访问的时候都阻塞。之后在seteventrn恢复work的工作,这样看起来没问题, 但是work thread可能存在被别人终止的情况, 这rn样就又要我让他们采用Mutex,但是Mutex不支持信号计数。。。rnrnrn用多个对象来模拟也行, 但一定要是内核对象数量是O(1), 而不是O(N)。rnrn
多线程同步问题?!
class AThread implements Runnablernrn private int x=0;rn public void run()rn rn while(true)rn rn rn for(int i=0;i<3;i++)rn rn System.out.print("* ");rn rn System.out.println();rn tryThread.sleep(1000);catch(Exception e)rn rn rn rnrnclass BThread implements Runnablernrn public void run()rn rn while(true)rn rn rn System.out.println("& ");rn tryThread.sleep(100);catch(Exception e)rn rn rn rn rnclass CThread implements Runnablernrn public void run()rn rn while(true)rn rn rn System.out.println("$ ");rn tryThread.sleep(500);catch(Exception e)rn rn rn rn rnclass PrintThreadrnrn public static void main(String [] args)rn rn //String str=new String("");rn new Thread(new AThread()).start();rn new Thread(new BThread()).start();rn new Thread(new CThread()).start();rn rn rn输出的结果为:rn* * *rn&rn$rn$rn$rn$rn$rn*&rn* *rn我想这应该是线程没有同步的问题.如果我想使用synchronized(str)我应该在哪创建一个str对象呢.同一个对象?rn
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview