我是靠谱客的博主 害羞乐曲,最近开发中收集的这篇文章主要介绍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 invalid integer_java 锁Integer等对象失败所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部