A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 希望的曙光 中级黑马   /  2013-1-5 11:15  /  1370 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在多线程中,什么时候要用到同步代码块,同步代码块的具体作用是什么

7 个回复

倒序浏览
同步同步嘛 ,顾名思义,就是  要数据同步,
在多个线程对同一数据操作时,而又要避免线程不规则运行状态而造成数据的错误,我们就要对改变数据的某一块儿进行同步。
同步同时可以锁,从而达到数据的正确性,安全性。
回复 使用道具 举报
当多个线程对一个共享资源并发访问时,由于CPU是分片执行,
所以很难保证每个线程访问的是同一份数据,就会出现数据不一致现象。
那么这时候为了保证数据的正确,就需要对数据进行同步,即上锁。
同步的作用就是为了保证共享资源的前后一致性。
在数据库中每个事务都必须满足四个特性ACID,原子性,一致性,隔离性,持久性。
可以查一下这方面的资料,很简单的,

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
一、同步的作用:就是为了保证共享资源的前后一致性。
二、判断需要用到同步代码的地方

1.这些代码会在多线程中运行

2.要明确是否有共享数据,或者共享对象,共享方法,共享属性

3。哪些代码是操作这么共享数据的。

这个例子会出现的问题:在add方法执行后,cpu被切换走,线程1还来不及把返回的数据打印,这时进入到线程2,又执行了add方法sum值又一次改变。这时候cpu切换回了线程1,继续执行打印语句。这时候就会打印错误信息。打印的值是线程2执行后的sum的值。并笔试第一次线程1执行后的值。解决方法就是将add方法改成同步函数。

银行例子:

实体类bank----------------------------------

public class Bank {

private double sum=0;
public synchronized double add(double money){
  try {
   Thread.sleep(10);
  } catch (InterruptedException e) {
      e.printStackTrace();
  }
  sum=sum+money;
  return sum;
}
}

Runable类,(在线程中运行的代码)--------------------------

class BankRunnable implements Runnable{
private Bank bank;

public BankRunnable(Bank bank){
  this.bank=bank;
}
@Override
public void run() {
  for(int i=0;i<3;i++){
   System.out.println("银行现在有:"+this.bank.add(100)+"元");
  }
}

测试方法--------------------------------------

public static void main(String[] args) {
  BankRunnable br=new BankRunnable(new Bank());
  Thread t1=new Thread(br);
  Thread t2=new Thread(br);
  t1.start();
  t2.start();
}
回复 使用道具 举报
修心者 发表于 2013-1-5 14:29
当多个线程对一个共享资源并发访问时,由于CPU是分片执行,
所以很难保证每个线程访问的是同一份数据,就会 ...

在我心中,你是神一样的存在,你在八维住吗,有时间请教一下
回复 使用道具 举报
gaoyang525445 发表于 2013-1-5 16:28
在我心中,你是神一样的存在,你在八维住吗,有时间请教一下

呵呵,我喜欢你的坦诚,我住在芜湖,
回复 使用道具 举报
修心者 发表于 2013-1-5 17:52
呵呵,我喜欢你的坦诚,我住在芜湖,

太远了,有时间来北京的话,交流一下,qq⑤⑨⑥③另以④⑥期
回复 使用道具 举报
gaoyang525445 发表于 2013-1-5 18:09
太远了,有时间来北京的话,交流一下,qq⑤⑨⑥③另以④⑥期

北京,我一定会去的,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马