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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蒙武辉 黑马帝   /  2012-2-12 12:04  /  2648 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

同步代码块如下:
Synchronized(对象)
{
      需要被同步的代码;
}
疑问:为啥要同步,同步有什么作用?括号里的对象代表什么意思?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

5 个回复

倒序浏览
      当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。
    对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。Java对于多线程的安全问题提供了专业的解决方式:同步代码块。
多线程同步代码块
       对象如同锁。持有锁的线程可以在同步中执行。
       没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。
同步的前提:
        必须要有两个或者两个以上的线程。
        必须是多个线程使用同一个锁。
        必须保证同步中只能有一个线程在运行。

好处:解决了多线程的安全问题。
弊端:多个线程需要判断锁,较为消耗资源,

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法,在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性
synchronized(o) {} 这里面的o可以是一个任何Object对象或数组,并不一定是它本身对象或者类,谁拥有o这个锁,谁就能够操作该块程序代,每个Object只有一把锁(Lock)与之关联,当进行到Synchronized语句或函数的时候,这把锁就会被当前的线程(thread)拿走,其他的(thread)再去访问的时候拿不到锁就被暂停了

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
同步代码块如下:
Synchronized(对象)
{
      需要被同步的代码;
}
同步的好处,避免访问错误。先说明同步代码,例如:
class A{
   A(String name,String sex){
     this.name = name;
     this.sex = sex;
  }
   Object obj = new Object();
  Synchronized(obj)
  {
    System.out.println("name=="+name);  
    System.out.println("sex=="+sex);
  }

}
如果没有同步,根据cpu的执行,线程1获得执行权后读取第一条语句System.out.println("name=="+name)突然因为某种原因失去cpu的使用权,
接下来的某个线程2却获得cpu执行权,但是而且执行了两条输出语句,此时建立的A对象已经再次被赋值了原有的对象值被覆盖掉,再次获得执
行权的线程1却输出System.out.println("sex=="+sex)是另外一个对象的值。
Synchronized(对象)中对象,在以后的使用中会出现多个进程访问同步代码或者使用同步函数,会发现可能还是会出现安全问题。此时可能使用的
不是同一个锁。所以希望通过建立唯一对象来实现其安全性。



评分

参与人数 1技术分 +2 收起 理由
唐秀启 + 2 神马都是浮云

查看全部评分

回复 使用道具 举报
如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。 在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。在Java里面,通过synchornized 进行同步的保证。比如 class MyTest { private static final Object lock = new Object(); public static synchronized void test(){ // 同步的方法 } public void test2(){ synchronized(lock){ // 方法级同步,也可以使用this实现对象级同步 } } }

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
大概理解了,谢谢各位高人指点。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马