java实现mysql同步_[java实现数据库同步]java实现同步的几种方式(总结)

为何要使用同步?

java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),

将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,

从而保证了该变量的唯一性和准确性。

一、实例

举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0。但哪个余额对应哪个呢?很难说清楚,因此多线程的同步问题就应运而生。

二、不使用同步方法时

Bank.java

publicclassBank{

privateintcount=0;//账户余额

//存钱

publicvoidaddMoney(intmoney){

count+=money;

System.out.println(System.currentTimeMillis()+"存进:"+money);

}

//取钱

publicvoidsubMoney(intmoney){

if(count-money<0){

System.out.println("余额不足");

return;

}

count-=money;

System.out.println(+System.currentTimeMillis()+"取出:"+money);

}

//查询

publicvoidlookMoney(){

System.out.println("账户余额:"+count);

}

}

SyncThreadTest.java

packagethreadTest;

publicclassSyncThreadTest{

publicstaticvoidmain(Stringargs[]){

finalBankbank=newBank();

Threadtadd=newThread(newRunnable(){

@Override

publicvoidrun(){

//TODOAuto-generatedmethodstub

while(true){

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

bank.addMoney(100);

bank.lookMoney();

System.out.println("

");

}

}

});

Threadtsub=newThread(newRunnable(){

@Override

publicvoidrun(){

//TODOAuto-generatedmethodstub

while(true){

bank.subMoney(100);

bank.lookMoney();

System.out.println("

");

try{

Thread.sleep(1000);

}catch(I

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值