Java的同步与锁的问题
请大神们帮帮小弟这个synchronized问题吧~都纠结好久了,下面这是一个运算类的代码:
这下边是主函数的:
我的输出是这样的:
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的方法一样了吗
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的方法一样了吗
...全文
相关推荐
Java线程之锁对象Lock-同步问题更完美的处理方式代码实例
Java线程之锁对象Lock-同步问题更完美的处理方式代码实例Java中的锁对象Lock是java.util.concurrent.locks包下的接口,提供了比使用synchronized方法和语句可获得的更广泛的锁定操作
Java多线程-线程的同步与锁的问题
Java多线程编程中,线程同步是一种解决并发问题的关键技术。当多个线程同时访问共享资源时,可能会引发数据不一致性和竞态条件。
java 中锁的性能提高办法
【Java 中锁的性能提高办法】在 Java 多线程编程中,锁是实现线程安全的关键机制。然而,不当的锁使用可能会导致性能瓶颈,甚至引发死锁等问题。以下是一些提高 Java 中锁性能的技术和策略:1.
改善Java中锁的性能_.docx
在Java编程中,锁是多线程环境下保证数据一致性与安全性的重要机制。然而,不当的锁使用可能导致性能下降,甚至引发死锁等严重问题。本文将探讨如何通过优化策略改善Java中锁的性能。
Java并发的CAS原理与ABA问题的讲解
Java并发编程中的CAS(Compare and Swap)是一种无锁同步机制,它是实现线程安全的关键技术。CAS操作包含三个参数:内存地址V、预期原值A和新值B。



