java线程统一_Java线程结果不一致
我有一个实现可运行的线程类和一个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线程结果不一致相关推荐
- java 线程状态_JAVA线程漫谈:线程状态与状态转换解析
线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...
- java 线程状态_Java线程为何没有Running状态?我猜你不知道。
作者:国栋原文:https://my.oschina.net/goldenshaw/blog/705397 Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言, ...
- java 线程安全性_Java线程安全性问题摘要_Power Node Java Academy的组织
在Java内存模型上 不同的平台,内存模型不同,但是jvm内存模型规范是统一的. 实际上,Java的多线程并发问题最终将反映在Java的内存模型中. 所谓的线程安全无非是控制多个线程对多个资源的有序访 ...
- java 线程机制_Java线程机制学习
前面的文章中总结过Java中用来解决共享资源竞争导致线程不安全的几种常用方式: synchronized: ReentrantLock: ThreadLocal: 这些都是在简单介绍了基本用法的基础上 ...
- java 线程作用_Java 线程池的作用
现在服务器端的应用程序几乎都采用了"线程池"技术,这主要是为了提高系统效率.因为如果服务器对应每一个请求就创建一个线程的话,在很短的一段时间内就会产生很多创建和销毁线程动作,导致服 ...
- java线程触发_java线程
线程. 状态 新建状态(New): 当用 new 操作符创建一个线程时, 例如 new Thread(r),线程还没有开始运行,此时 线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线 ...
- java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...
导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...
- 线程池 java 新建方式_Java线程池的四种创建方式
Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...
- java中我爱你_Java线程学习(转)
编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:s ...
最新文章
- 通用窗口类 Inventory Pro 2.1.2 Demo1(下)
- 好爽!我在上海被机器人“马杀鸡”了
- PASSWORD,ENABLE,CONSOLE,VTY及TACACS认证顺序及区别
- Velocity 页面加减运算
- 什么变量在堆内存里存放,什么变量在栈内存里存放
- c++嵌入linux指令以查找文件夹
- SpringBoot工程不注册到Eureka上
- 如何用Excel制作甘特图?专业教程教你快速解决问题
- QQ登录界面实现(JAVA)
- 完美安装运行Xcelsius 2008 SP3解决方案
- PIC16F877A与Proteus仿真-2位7段数码管驱动
- 下载visual studio 2022 Professional 离线包
- 域名转换为IP地址示例
- java fx 内置图标_DOC-05-01 使用内置的布局面板
- 【GNN报告】北邮石川组
- react:制作新页面
- ARM 微处理器的数据类型
- 对“动态多重网络”建模与目标选择方法的介绍
- android 开机动画logo介绍
- Halcon高斯背景估计--estimate_background_illumination
热门文章
- mysql alter table_mysql ALTER TABLE 的用法
- AUTOSAR从入门到精通100讲(三)-基于UDS服务的BootLoader架构和刷写流程
- elementui中tabs切换item中的内容会变_中后台UX优化之道
- Git教程学习总结(分享给热爱学习的你,团队的协作离不开你呀)
- java sqlserver ssl_拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)...
- 怎么调整计算机显示屏,电脑显示器怎样调大屏幕
- 用纯CSS禁止鼠标点击事件以及禁止鼠标样式
- Html5开发-使用Canvas绘制图片
- Flexible 弹性盒子模型之CSS align-items 属性
- 浏览器记住密码的自动填充Input问题完美解决方案