黑马程序员技术交流社区

标题: synchronized关键词的标志位问题 [打印本页]

作者: 彭盼    时间: 2012-3-14 16:07
标题: synchronized关键词的标志位问题
多线程中,老师讲到synchronized同步代码时,提到synchronized的参数对象有个标志位问题,为1则代码块执行,为0则阻塞,这个标志位是什么东东,synchronized()后面括号里的对象又是什么东西,怎么随便做个对象都能用呢
作者: 黄奇耀    时间: 2012-3-14 16:20
只要是对象都可以。
作者: 可见    时间: 2012-3-14 16:25
多线程的运行出现了安全问题。

问题的原因:
        当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,
        另一个线程参与进来执行。导致共享数据的错误。

解决办法:
        对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。



Java对于多线程的安全问题提供了专业的解决方式。

就是同步代码块。

synchronized(对象)
{
        需要被同步的代码

}
对象如同锁。持有锁的线程可以在同步中执行。
没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。

火车上的卫生间---经典。

同步的前提:
1,必须要有两个或者两个以上的线程。
2,必须是多个线程使用同一个锁。

必须保证同步中只能有一个线程在运行。


好处:解决了多线程的安全问题。

弊端:多个线程需要判断锁,较为消耗资源,
作者: 吴璞玉    时间: 2012-3-14 17:37
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。而标志位就是在表示是否有线程占有了该锁
作者: 李成航    时间: 2012-3-14 17:40
该对象是你需要同步的对象,主要是为了防止多线程对该对象的某些操作。
作者: 贠(yun)靖    时间: 2012-3-14 18:16
synchronized(对象)
{
        需要被同步的代码

}  同步代码块的锁的格式 就是这个  这是规定  里面传的参数就是一个对象  所以传任何对象都可以 前提是要和需要同步的代码有关的对象
   毕老师说的1和0 只是假设这个对象是两个值即条件1条件2     就是让人好理解  满足条件1  就可进入锁  不满足就不能进入锁     
   只是把1 0 这种情况比喻成标志位的对象的 那两种情况而已  





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