黑马程序员技术交流社区

标题: 多线程中同步代码块的问题? [打印本页]

作者: 希望的曙光    时间: 2013-1-5 11:15
标题: 多线程中同步代码块的问题?
在多线程中,什么时候要用到同步代码块,同步代码块的具体作用是什么
作者: 王少雷    时间: 2013-1-5 12:36
同步同步嘛 ,顾名思义,就是  要数据同步,
在多个线程对同一数据操作时,而又要避免线程不规则运行状态而造成数据的错误,我们就要对改变数据的某一块儿进行同步。
同步同时可以锁,从而达到数据的正确性,安全性。
作者: 罗利华    时间: 2013-1-5 14:29
当多个线程对一个共享资源并发访问时,由于CPU是分片执行,
所以很难保证每个线程访问的是同一份数据,就会出现数据不一致现象。
那么这时候为了保证数据的正确,就需要对数据进行同步,即上锁。
同步的作用就是为了保证共享资源的前后一致性。
在数据库中每个事务都必须满足四个特性ACID,原子性,一致性,隔离性,持久性。
可以查一下这方面的资料,很简单的,
作者: sun~~    时间: 2013-1-5 16:19
一、同步的作用:就是为了保证共享资源的前后一致性。
二、判断需要用到同步代码的地方

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 16:28
修心者 发表于 2013-1-5 14:29
当多个线程对一个共享资源并发访问时,由于CPU是分片执行,
所以很难保证每个线程访问的是同一份数据,就会 ...

在我心中,你是神一样的存在,你在八维住吗,有时间请教一下
作者: 罗利华    时间: 2013-1-5 17:52
gaoyang525445 发表于 2013-1-5 16:28
在我心中,你是神一样的存在,你在八维住吗,有时间请教一下

呵呵,我喜欢你的坦诚,我住在芜湖,
作者: 高阳    时间: 2013-1-5 18:09
修心者 发表于 2013-1-5 17:52
呵呵,我喜欢你的坦诚,我住在芜湖,

太远了,有时间来北京的话,交流一下,qq⑤⑨⑥③另以④⑥期
作者: 罗利华    时间: 2013-1-5 18:13
gaoyang525445 发表于 2013-1-5 18:09
太远了,有时间来北京的话,交流一下,qq⑤⑨⑥③另以④⑥期

北京,我一定会去的,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2