双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

Java的同步与锁的问题

领带有点歪 领带有点歪 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
请大神们帮帮小弟这个synchronized问题吧~都纠结好久了,下面这是一个运算类的代码:

public class Foo {

private int x = 100;

public int getX() {
return x;
}

public int fix(int y) {

synchronized (this) {
x = x - y;
}
return x;

}

这下边是主函数的:

public class MyRunable implements Runnable {

/**
* @param args
*/
private Foo foo = new Foo();

public static void main(String[] args) throws InterruptedException {

MyRunable r = new MyRunable();
new Thread(r, "Thread-A").start();
new Thread(r, "Thread-B").start();
}

@Override
public void run() {
for (int i = 0; i < 3; i++) {

this.fix(30);

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " 当前foo对象的值为:" + foo.getX());
}

}

public int fix(int y) {
return foo.fix(y);
}


我的输出是这样的:
Thread-A 当前foo对象的值为:40
Thread-B 当前foo对象的值为:40
Thread-A 当前foo对象的值为:-20
Thread-B 当前foo对象的值为:-20
Thread-A 当前foo对象的值为:-80
Thread-B 当前foo对象的值为:-80



可是我锁了运算的方法了阿~为啥还是两个线程同时运行了该方法呢~?要是改怎么改正呢~我如果把synchronized加在run上~那个到时算数对了~可是不就跟jion的方法一样了吗
...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
领带有点歪
Java EE 67,535 成员 225,843 内容