当前位置: 代码迷 >> 多核软件开发 >> 问个线程同步的有关问题
  详细解决方案

问个线程同步的有关问题

热度:10669   发布时间:2013-02-26 00:00:00.0
问个线程同步的问题
现在在学多线程, 然后看到sychronized(Object)关键字是对对象加锁, 让程序同时只能有一个线程来访问对象..
那如果我现在有一个类比如Person类, 里面有一些属性及属性的set get方法,
那当我new 一个Person对象的时候 需要加锁吗?

就像这样sychnorized(Person p = new Person()){...}

求高人解答下,感激不尽..

------解决方案--------------------------------------------------------
锁 ,主要是用来防止多个线程 同时操作一个对象 , 就有可能出现错误。
如果两个人 分别在两台ATM 对同一个账户取钱
假设 他们同时读取到余额为1000 , 第一个人A 取走了800 , 此时账户余额为 1000 - 800 = 200
然后写入数据库 此时余额字段为 200
第二个人B 因为是和A同时读到的数据 ,所以他那边显示的数据也为1000 ,他取走500 此时账户余额为1000 - 500 = 500 , 然后写入数据库,此时数据库余额为500

这样做肯定是不合理的,所以要加锁,同一个时间,只能有一条线程访问那个对象


看到这条代码 , 笑死我了。。。
sychnorized(Person p = new Person()){...}

------解决方案--------------------------------------------------------
这样写没有问题,但是不会产生线程同步的效果,因为每次都是锁的新对象,synchronized(HelloTest test = new HelloTest()),对新生成的对象枷锁,好不效果。如果同步应该对同一对象枷锁。
------解决方案--------------------------------------------------------
线程同步的关键不在于谁是锁,而在于谁和谁用同一把锁

用同一把锁的代码段之间是互斥的
------解决方案--------------------------------------------------------
多线程的锁是用来访问一个程序要求一个对象去访问的你new应该不在嗦的范围内吧就像卖票两个人同时售票当生一张票的时候两个人能都卖吗不可以吧是不是要一张一张的卖所以要加锁啊等进来一个人买了后才可以让另一个人进来去买票吧好好想想
  相关解决方案