问个线程同步的问题

AndyXuq 2012-06-06 05:03:59
现在在学多线程, 然后看到sychronized(Object)关键字是对对象加锁, 让程序同时只能有一个线程来访问对象..
那如果我现在有一个类比如Person类, 里面有一些属性及属性的set get方法,
那当我new 一个Person对象的时候 需要加锁吗?

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

求高人解答下,感激不尽..
...全文
211 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
newsupman 2012-06-25
  • 打赏
  • 举报
回复
用TBB/IPP之类的库多好,想不到现在人们还在用纯c写多线程,这种多线程都是假的啊
sffx123 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
我这样写运行到是没什么问题的,有一个HelloTest类,里面就一个成员a,并有getA和setA方法

Java code


HelloTest test;
synchronized(test = new HelloTest()){
test.setA(5);
System.out.println(……
[/Quote]这个问题感觉应该是synchronized语法的要求出入对象,第一种写法是传入对象了赋值语句(主体还是左边那个变量)符合要求,而第二种写法只是一个语句表示声明一个对象,编译器可能不识别。猜测。这个不是关注重点,重点问题是为什么要进行线程同步,为什么锁能实现线程同步?先说第一点,线程同步不是随便用的,看有没有必要,如果一个类生成的对象在整个程序中,有多个线程要使用它,这时候就需要在可能会出现线程同步问题的地方加锁,来保证每次只有一个线程使用,来确保整个程序中,数据的一致性,最简单的例子就是比如一个对象全局是唯一的,那么对这个对象属性进行操作的时候就要加锁了,保证数据一致。除非有必要一般不要加锁,影响效率。最常用的线程同步方法就是使用synchronized关键字,楼主的是用synchronized(锁对象){}这种结构来实现的,所谓的“加锁”,不是给“锁对象”加锁,是给你{}内部的代码加锁,或者更宽泛的说是给外面的对象加锁,每个对象都提供“锁”的功能,并只提供一把“钥匙”,有线程调用同步代码的时候它会跟“锁对象”要钥匙,有就给它,线程正常执行(执行完事后释放“钥匙”),下次有新的线程调用的时候没有了“钥匙”,该线程就会等待直到有“钥匙”(别的线程释放),因为钥匙只有一把,这样就保证了每次只有一个线程对该同步块就行了访问,那么要保证唯一访问就要保证“锁对象”的唯一,不能每次使用都new一个新的,那样锁的意义就没有了。说的有点多,有不对的地方大家指正。
z_c123456 2012-06-06
  • 打赏
  • 举报
回复
多线程的锁是用来访问一个程序要求一个对象去访问的你new应该不在嗦的范围内吧就像卖票两个人同时售票当生一张票的时候两个人能都卖吗不可以吧是不是要一张一张的卖所以要加锁啊等进来一个人买了后才可以让另一个人进来去买票吧好好想想
RDroid 2012-06-06
  • 打赏
  • 举报
回复
线程同步的关键不在于谁是锁,而在于谁和谁用同一把锁

用同一把锁的代码段之间是互斥的
MiceRice 2012-06-06
  • 打赏
  • 举报
回复
你这样写:
HelloTest test;
synchronized(test = new HelloTest()){
test.setA(5);
System.out.println(test.getA());
}

效果等同于:
HelloTest test = new HelloTest();
synchronized(test){
test.setA(5);
System.out.println(test.getA());
}

因为本来赋值语句最终的返回值就是等号左边,但是前者的写法比较不推荐。


其实类似于有时候做循环:
while ( (line = reader.nextLine()) != null)
土豆的老公 2012-06-06
  • 打赏
  • 举报
回复
  HelloTest test;
synchronized(test = new HelloTest()){
test.setA(5);
System.out.println(test.getA());
}



synchronized(test = new HelloTest()) ....
test = new HelloTest();
synchronized(test) ....看下有多大区别 就像 if(flag = (1>2)){}这样也是没错的。
iGoodLoser 2012-06-06
  • 打赏
  • 举报
回复
这样写没有问题,但是不会产生线程同步的效果,因为每次都是锁的新对象,synchronized(HelloTest test = new HelloTest()),对新生成的对象枷锁,好不效果。如果同步应该对同一对象枷锁。
AndyXuq 2012-06-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

我是这样想的,synchronized既然是对对象加锁,那我New操作不是也返回一个对象么, 就像我上面的p, 我这样写
sychnorized(Person p = new Person()){...}
是不是就意味着我对p这个Person对象加锁了呢?


你这样写 , 报错了吗? 这写法太另类了 。 估计你们老师都没办法跟你解释了。
[/Quote]
我这样写运行到是没什么问题的,有一个HelloTest类,里面就一个成员a,并有getA和setA方法
Java code

HelloTest test;
synchronized(test = new HelloTest()){
test.setA(5);
System.out.println(test.getA());
}


但这样就有问题
Java code

synchronized(HelloTest test = new HelloTest()){...}
AndyXuq 2012-06-06
  • 打赏
  • 举报
回复
我这样写运行到是没什么问题的,有一个HelloTest类,里面就一个成员a,并有getA和setA方法

HelloTest test;
synchronized(test = new HelloTest()){
test.setA(5);
System.out.println(test.getA());
}

但这样就有问题

synchronized(HelloTest test = new HelloTest()){...}
_jerrytiger 2012-06-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

我是这样想的,synchronized既然是对对象加锁,那我New操作不是也返回一个对象么, 就像我上面的p, 我这样写
sychnorized(Person p = new Person()){...}
是不是就意味着我对p这个Person对象加锁了呢?
[/Quote]

你这样写 , 报错了吗? 这写法太另类了 。 估计你们老师都没办法跟你解释了。
AndyXuq 2012-06-06
  • 打赏
  • 举报
回复
我是这样想的,synchronized既然是对对象加锁,那我New操作不是也返回一个对象么, 就像我上面的p, 我这样写
sychnorized(Person p = new Person()){...}
是不是就意味着我对p这个Person对象加锁了呢?
_jerrytiger 2012-06-06
  • 打赏
  • 举报
回复
锁 ,主要是用来防止多个线程 同时操作一个对象 , 就有可能出现错误。
如果两个人 分别在两台ATM 对同一个账户取钱
假设 他们同时读取到余额为1000 , 第一个人A 取走了800 , 此时账户余额为 1000 - 800 = 200
然后写入数据库 此时余额字段为 200
第二个人B 因为是和A同时读到的数据 ,所以他那边显示的数据也为1000 ,他取走500 此时账户余额为1000 - 500 = 500 , 然后写入数据库,此时数据库余额为500

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


看到这条代码 , 笑死我了。。。
sychnorized(Person p = new Person()){...}
brightyq 2012-06-06
  • 打赏
  • 举报
回复
new 的时候不加,不存在多线程同时操作的问题。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧