我是靠谱客的博主 害羞乐曲,这篇文章主要介绍java invalid integer_java 锁Integer等对象失败,现在分享给大家,希望可以做个参考。

在学习并发编程时,多个线程对同一个Integer对象进行操作时,我想当然的直接对这个Integer对象加锁。然而最终结果让我百思不得其解,加锁无效。

public class TestJoin {

static A testA = new A();

public volatile static Integer t = 0;

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

Thread[] threads = new Thread[10];

for (int j = 0; j < 10; j++) {

threads[j] = new Thread(testA);

threads[j].start();

}

for (int j = 0; j < 10; j++) {

threads[j].join();

}

System.out.println(t);

}

static class A implements Runnable {

@Override

public void run() {

for (int f = 0; f < 2000; f++) {

synchronized (t) {

t++;

}

}

}

}

}

最终输出为:

cf0cb5ae61faf813d4e8b908ce179404.png

并不是所预期的20000.

原因:java的自动封箱和解箱操作在作怪。这里的t++实际上是i = new Integer(t+1),所以执行完t++后,t已经不是原来的对象了,同步块自然就无效了

解决方法:将synchronized(t)变为synchronized(testA)即可

最后

以上就是害羞乐曲最近收集整理的关于java invalid integer_java 锁Integer等对象失败的全部内容,更多相关java内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部