我是这样想的,synchronized既然是对对象加锁,那我New操作不是也返回一个对象么, 就像我上面的p, 我这样写 sychnorized(Person p = new Person()){...} 是不是就意味着我对p这个Person对象加锁了呢?
我这样写运行到是没什么问题的,有一个HelloTest类,里面就一个成员a,并有getA和setA方法 HelloTest test; synchronized(test = new HelloTest()){ test.setA(5); System.out.println(test.getA()); }但这样就有问题 synchronized(HelloTest test = new HelloTest()){...}
我这样写运行到是没什么问题的,有一个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()){...}
这样写没有问题,但是不会产生线程同步的效果,因为每次都是锁的新对象,synchronized(HelloTest test = new HelloTest()),对新生成的对象枷锁,好不效果。如果同步应该对同一对象枷锁。
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)){}这样也是没错的。
你这样写: 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)
如果两个人 分别在两台ATM 对同一个账户取钱
假设 他们同时读取到余额为1000 , 第一个人A 取走了800 , 此时账户余额为 1000 - 800 = 200
然后写入数据库 此时余额字段为 200
第二个人B 因为是和A同时读到的数据 ,所以他那边显示的数据也为1000 ,他取走500 此时账户余额为1000 - 500 = 500 , 然后写入数据库,此时数据库余额为500这样做肯定是不合理的,所以要加锁,同一个时间,只能有一条线程访问那个对象
看到这条代码 , 笑死我了
sychnorized(Person p = new Person()){...}
sychnorized(Person p = new Person()){...}
是不是就意味着我对p这个Person对象加锁了呢?
synchronized(test = new HelloTest()){
test.setA(5);
System.out.println(test.getA());
}但这样就有问题 synchronized(HelloTest test = new HelloTest()){...}
Java code HelloTest test;
synchronized(test = new HelloTest()){
test.setA(5);
System.out.println(test.getA());
}
但这样就有问题
Java code synchronized(HelloTest test = new HelloTest()){...}
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)){}这样也是没错的。
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)