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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭盼 中级黑马   /  2012-3-14 16:07  /  1797 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程中,老师讲到synchronized同步代码时,提到synchronized的参数对象有个标志位问题,为1则代码块执行,为0则阻塞,这个标志位是什么东东,synchronized()后面括号里的对象又是什么东西,怎么随便做个对象都能用呢

5 个回复

倒序浏览
只要是对象都可以。
回复 使用道具 举报
多线程的运行出现了安全问题。

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

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



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

就是同步代码块。

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

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

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

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

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


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

弊端:多个线程需要判断锁,较为消耗资源,

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。而标志位就是在表示是否有线程占有了该锁
回复 使用道具 举报
该对象是你需要同步的对象,主要是为了防止多线程对该对象的某些操作。
回复 使用道具 举报
synchronized(对象)
{
        需要被同步的代码

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