我有一个实现可运行的线程类和一个int计数器作为实例变量。两种同步方法add和sub。当我以某种方式运行测试类时,它几次会输出错误的结果。据我了解,当方法同步时,整个对象将被锁定以供其他线程访问,这种逻辑每次我们都应该获得相同的结果正确吗?事实并非如此。我想念什么吗?

我的机器是Windows 7、64位。

public class ThreadClass implements Runnable {

int counter = 0;

@Override

public void run() {

add();

sub();

}

public synchronized void add() {

System.out.println("ADD counter" + (counter = counter + 1));

}

public synchronized void sub() {

System.out.println("SUB counter" + (counter = counter - 1));

}

}

测试类

public class ThreadTest {

public static void main(String args[]) {

ThreadClass tc = new ThreadClass();

Thread tc0 = new Thread(tc);

tc0.start();

tc0.setPriority(Thread.MAX_PRIORITY);

Thread tc1 = new Thread(tc);

tc1.start();

tc1.setPriority(Thread.NORM_PRIORITY);

Thread tc2 = new Thread(tc);

tc2.start();

tc2.setPriority(Thread.MIN_PRIORITY);

}

}

结果

ADD counter1

ADD counter2

SUB counter1

SUB counter0

ADD counter1

SUB counter0

注意: 您可能需要进行几次运行才能产生这种不一致。

java线程统一_Java线程结果不一致相关推荐

  1. java 线程状态_JAVA线程漫谈:线程状态与状态转换解析

    线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...

  2. java 线程状态_Java线程为何没有Running状态?我猜你不知道。

    作者:国栋原文:https://my.oschina.net/goldenshaw/blog/705397 Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言, ...

  3. java 线程安全性_Java线程安全性问题摘要_Power Node Java Academy的组织

    在Java内存模型上 不同的平台,内存模型不同,但是jvm内存模型规范是统一的. 实际上,Java的多线程并发问题最终将反映在Java的内存模型中. 所谓的线程安全无非是控制多个线程对多个资源的有序访 ...

  4. java 线程机制_Java线程机制学习

    前面的文章中总结过Java中用来解决共享资源竞争导致线程不安全的几种常用方式: synchronized: ReentrantLock: ThreadLocal: 这些都是在简单介绍了基本用法的基础上 ...

  5. java 线程作用_Java 线程池的作用

    现在服务器端的应用程序几乎都采用了"线程池"技术,这主要是为了提高系统效率.因为如果服务器对应每一个请求就创建一个线程的话,在很短的一段时间内就会产生很多创建和销毁线程动作,导致服 ...

  6. java线程触发_java线程

    线程. 状态 新建状态(New): 当用 new 操作符创建一个线程时, 例如 new Thread(r),线程还没有开始运行,此时 线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线 ...

  7. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  8. 线程池 java 新建方式_Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...

  9. java中我爱你_Java线程学习(转)

    编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:s ...

最新文章

  1. 通用窗口类 Inventory Pro 2.1.2 Demo1(下)
  2. 好爽!我在上海被机器人“马杀鸡”了
  3. PASSWORD,ENABLE,CONSOLE,VTY及TACACS认证顺序及区别
  4. Velocity 页面加减运算
  5. 什么变量在堆内存里存放,什么变量在栈内存里存放
  6. c++嵌入linux指令以查找文件夹
  7. SpringBoot工程不注册到Eureka上
  8. 如何用Excel制作甘特图?专业教程教你快速解决问题
  9. QQ登录界面实现(JAVA)
  10. 完美安装运行Xcelsius 2008 SP3解决方案
  11. PIC16F877A与Proteus仿真-2位7段数码管驱动
  12. 下载visual studio 2022 Professional 离线包
  13. 域名转换为IP地址示例
  14. java fx 内置图标_DOC-05-01 使用内置的布局面板
  15. 【GNN报告】北邮石川组
  16. react:制作新页面
  17. ARM 微处理器的数据类型
  18. 对“动态多重网络”建模与目标选择方法的介绍
  19. android 开机动画logo介绍
  20. Halcon高斯背景估计--estimate_background_illumination

热门文章

  1. mysql alter table_mysql ALTER TABLE 的用法
  2. AUTOSAR从入门到精通100讲(三)-基于UDS服务的BootLoader架构和刷写流程
  3. elementui中tabs切换item中的内容会变_中后台UX优化之道
  4. Git教程学习总结(分享给热爱学习的你,团队的协作离不开你呀)
  5. java sqlserver ssl_拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)...
  6. 怎么调整计算机显示屏,电脑显示器怎样调大屏幕
  7. 用纯CSS禁止鼠标点击事件以及禁止鼠标样式
  8. Html5开发-使用Canvas绘制图片
  9. Flexible 弹性盒子模型之CSS align-items 属性
  10. 浏览器记住密码的自动填充Input问题完美解决方案