Redian新闻
>
Java synchronized method一问
avatar
Java synchronized method一问# Java - 爪哇娇娃
x*o
1
问个简单问题
CLASS A{
PUBLIC synchronized METHOD 1
PUBLIC synchronized METHOD 2
}
THREAD A
THREAD B
THREAD A ACCESS METHOD 1 SAME TIME THREAD B ACCESS METHOD 2
这里有什么问题
avatar
Y*G
2
method 1 and method 2 won't be called on the same instance any time.

【在 x****o 的大作中提到】
: 问个简单问题
: CLASS A{
: PUBLIC synchronized METHOD 1
: PUBLIC synchronized METHOD 2
: }
: THREAD A
: THREAD B
: THREAD A ACCESS METHOD 1 SAME TIME THREAD B ACCESS METHOD 2
: 这里有什么问题

avatar
x*o
3

是LOCK,对吧?

【在 Y**G 的大作中提到】
: method 1 and method 2 won't be called on the same instance any time.
avatar
Y*G
4
对,就是打饭的时候得一个一个来,不许一拥而上
avatar
x*o
5

MD老印非说不是

【在 Y**G 的大作中提到】
: 对,就是打饭的时候得一个一个来,不许一拥而上
avatar
p*2
6
你问的是什么问题呀?
烙印说不是是什么意思?
avatar
x*o
7

烙印问我这样是什么,我说有锁了,线程要一个个来
三哥说不会锁。。。

【在 p*****2 的大作中提到】
: 你问的是什么问题呀?
: 烙印说不是是什么意思?

avatar
o*1
8
老印说的对。

【在 x****o 的大作中提到】
:
: 烙印问我这样是什么,我说有锁了,线程要一个个来
: 三哥说不会锁。。。

avatar
x*o
9

同一个instance下不锁?两个thread都可以access?

【在 o**1 的大作中提到】
: 老印说的对。
avatar
p*2
10

你这个例子没看到有instance呀

【在 x****o 的大作中提到】
:
: 同一个instance下不锁?两个thread都可以access?

avatar
x*o
11

那个method都不是static的,何况要不是一个instance还锁啥

【在 p*****2 的大作中提到】
:
: 你这个例子没看到有instance呀

avatar
p*2
12

所以你跟烙印没说到一起呀。

【在 x****o 的大作中提到】
:
: 那个method都不是static的,何况要不是一个instance还锁啥

avatar
c*e
13
烙印说的对啊,如果是一个instance,会锁住。但是,如果2个thread是不同instance,
就不会锁住啊。
一般来说,可以在class A里面设置一个static int temp = 0;在method 1里面,如果
temp == 0, do something, then temp =1;在method 2里面,如果temp == 1,do
something, then temp = 0;见过有人用這種方法。

【在 x****o 的大作中提到】
: 问个简单问题
: CLASS A{
: PUBLIC synchronized METHOD 1
: PUBLIC synchronized METHOD 2
: }
: THREAD A
: THREAD B
: THREAD A ACCESS METHOD 1 SAME TIME THREAD B ACCESS METHOD 2
: 这里有什么问题

avatar
c*e
14
你是说
CLASS A{
PUBLIC static synchronized METHOD 1
PUBLIC static synchronized METHOD 2
} ?
这倒可以试试。

【在 x****o 的大作中提到】
:
: 那个method都不是static的,何况要不是一个instance还锁啥

avatar
z*3
15
阿三显然说错了,你的例子可行是因为对于int的赋值操作是原子操作
所以不会受到多线程的干扰,如果是一个对象,搞不好就挂了
还有就是,你的例子的控制锁在对象身上,而不是静态变量身上
所以do something并不会被多线程所打扰
你们居然这样用多线程,很危险啊
使用原子操作需要对jvm的机制了解才可以
否则老老实实用synchrnoized
如果这个int计算稍微复杂点,加加减减,再作一个pow
你这个估计就不精准了,异常可能倒是不太会抛,但是如果有除以0的话
那就有可能有异常出来

【在 c*********e 的大作中提到】
: 烙印说的对啊,如果是一个instance,会锁住。但是,如果2个thread是不同instance,
: 就不会锁住啊。
: 一般来说,可以在class A里面设置一个static int temp = 0;在method 1里面,如果
: temp == 0, do something, then temp =1;在method 2里面,如果temp == 1,do
: something, then temp = 0;见过有人用這種方法。

avatar
x*o
16

你这同步锁改成逻辑了?

【在 c*********e 的大作中提到】
: 烙印说的对啊,如果是一个instance,会锁住。但是,如果2个thread是不同instance,
: 就不会锁住啊。
: 一般来说,可以在class A里面设置一个static int temp = 0;在method 1里面,如果
: temp == 0, do something, then temp =1;在method 2里面,如果temp == 1,do
: something, then temp = 0;见过有人用這種方法。

avatar
s*n
17
烙印说的队。
每个对象都有一个lock field. 相对于windows里面的critical section.
sync方法就是lock(this).
你这里两个对象是两个 CS,自然不会同步。

【在 x****o 的大作中提到】
:
: 你这同步锁改成逻辑了?

avatar
b*i
18
楼主的两个thread里面访问的是同一个instance

【在 s*****n 的大作中提到】
: 烙印说的队。
: 每个对象都有一个lock field. 相对于windows里面的critical section.
: sync方法就是lock(this).
: 你这里两个对象是两个 CS,自然不会同步。

avatar
r*r
19
concurrent access 只是相对意义上的并行,因为多线程对同一个对象的操作,总是
要通过加锁实现,比如 synchronized, 或 lock()。
所以 synchrnozied method 也是为了实现 concurrent 的目标,这样理解对么?

【在 Y**G 的大作中提到】
: method 1 and method 2 won't be called on the same instance any time.
avatar
p*2
20

不早就跟你说了这个说法不对吗?

【在 r******r 的大作中提到】
: concurrent access 只是相对意义上的并行,因为多线程对同一个对象的操作,总是
: 要通过加锁实现,比如 synchronized, 或 lock()。
: 所以 synchrnozied method 也是为了实现 concurrent 的目标,这样理解对么?

avatar
r*r
21
因为我还怀疑嘛 。。。
那你说说,怎样才能算 concurrent access?

【在 p*****2 的大作中提到】
:
: 不早就跟你说了这个说法不对吗?

avatar
p*2
22

concurrency 就是多任务。同一时间能执行的任务越多并发性越高。

【在 r******r 的大作中提到】
: 因为我还怀疑嘛 。。。
: 那你说说,怎样才能算 concurrent access?

avatar
x*o
23

我再多问一句吧,多个对象冲突实例是什么?意义是什么?

【在 s*****n 的大作中提到】
: 烙印说的队。
: 每个对象都有一个lock field. 相对于windows里面的critical section.
: sync方法就是lock(this).
: 你这里两个对象是两个 CS,自然不会同步。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。