java多线程的题目_Java多线程一个有趣的题目
题目代码如下,问题:程序的输出结果?
public class TestSync2 implementsRunnable {int b = 100;synchronized void m1() throwsInterruptedException {
b= 1000;
Thread.sleep(500); //6
System.out.println("b=" +b);
}synchronized void m2() throwsInterruptedException {
Thread.sleep(250); //5
b = 2000;
}public static void main(String[] args) throwsInterruptedException {
TestSync2 tt= newTestSync2();
Thread t= new Thread(tt); //1
t.start(); //2
tt.m2(); //3
System.out.println("main thread b=" + tt.b); //4
}
@Overridepublic voidrun() {try{
m1();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
答案:
main thread b=2000b=1000或
main thread b=1000b=1000
分析:
首先熟悉下synchronized的用法:
指定加锁对象:对给定对象加锁,进入同步代码前需要活的给定对象的锁。
直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。
可能存在的误区:
1、由于对synchronized理解的不到位,由于很多时候,我们多线程都是操作一个synchronized的方法,当2个线程调用2个不同synchronized的方法的时候,认为是没有关系的,这种想法是存在误区的。直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
2、如果一个调用synchronized方法。另外一个调用普通方法是没有关系的,两个个是不存在等待关系的。
分析流程:
Java 都是从main方法执行的,上面说了有2个线程,但是这里就算修改线程优先级也没用,优先级是在2个程序都还没有执行的时候才有先后,现在这个代码一执行,主线程main已经执行了。对于属性变量 int b =100由于使用了synchronized也不会存在可见性问题(也没有必要再使用volatile申明),当执行1步骤的时候(Thread t = new Thread(tt); //1)线程是new状态,还没有开始工作。当执行2步骤的时候(t.start(); //2)当调用start方法,这个线程才正真被启动,进入runnable状态,runnable状态表示可以执行,一切准备就绪了,但是并不表示一定在cpu上面执行,有没有真正执行取决服务cpu的调度。在这里当执行3步骤必定是先获得锁(由于start需要调用native方法,并且在用完成之后在一切准备就绪了,但是并不表示一定在cpu上面执行,有没有真正执行取决服务cpu的调度,之后才会调用run方法,执行m1方法)。这里其实2个synchronized方法里面的Thread.sheep其实要不要是无所谓的,估计是就为混淆增加难度。3步骤执行的时候其实很快子线程也准备好了,但是由于synchronized的存在,并且是作用同一对象,所以子线程就只有必须等待了。由于main方法里面执行顺序是顺序执行的,所以必须是步骤3执行完成之后才可以到4步骤,而由于3步骤执行完成,子线程就可以执行m1了。这里就存在一个多线程谁先获取到的问题,如果4步骤先获取那么main thread b=2000,如果子线程m1获取到可能就b已经赋值成1000或者还没有来得及赋值4步骤就输出了可能结果就是main thread b=1000或者main thread b=2000,在这里如果把6步骤去掉那么b=执行在前和main thread b=在前就不确定了。但是由于6步骤存在,所以不管怎么都是main thread b=在前面,那么等于1000还是2000看情况,之后b=1000是一定固定的了。
java多线程的题目_Java多线程一个有趣的题目相关推荐
- java 多线程变量可见性_Java多线程:易变变量,事前关联和内存一致性
java 多线程变量可见性 什么是volatile变量? volatile是Java中的关键字. 您不能将其用作变量或方法名称. 期. 我们什么时候应该使用它? 哈哈,对不起,没办法. 当我们在多线程 ...
- java 线程面试题_JAVA多线程面试题(一)
1.进程和线程的区别 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进 ...
- java线程代码实现_Java 多线程代码实现讲解
作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...
- java 多线程并发 问题_JAVA多线程和并发基础面试问答
原文链接 译文连接作者:Pankaj 译者:郑旭东 校对:方腾飞 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌 ...
- java 锁旗标_Java多线程
Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...
- java线程怎么用_Java多线程基本使用
一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...
- java 多线程 并发实例_Java 多线程(并发)
线程释义 使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义.实例化和启动新线程. 一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具 ...
- java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...
- java线程池 锁_java多线程——锁
这是多线程系列第四篇,其他请关注以下: 如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍. ...
最新文章
- time 和 datetime 模块
- css中的三种基本定位机制
- 连咖啡首席产品经理左弘帆:all in小程序前你想清楚了吗?
- quad8是matlab中调用那个,Matlab 数值积分
- [导入]关于复制目录架构
- OpenJudge计算概论-找出第k大的数
- java class 字符串_java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer...
- 摸鱼也要讲究方法:工作学习中玩手机并不能缓解无聊和疲劳
- linux定时备份前一天,linux定时备份
- 重磅推出Android4开发系列精品课程
- 【爷青回系列】使用VMware虚拟机安装Windows XP系统!最详细!
- 服务器版dll修复工具,DLL修复工具哪个好?五款修复能力强推荐
- matlab读取本地图片,matlab读取图片
- 小米手机WIFI显示已连接,但无法访问互联网,新路由器其他设备都能连
- ORA-39194: Table mode jobs require the tables to be comma separated.
- 【观察】华为云:决胜拉美市场“正当时”,做出海企业的“好帮手”
- fuzzy extractor 模糊提取器的代码解读和实现
- zbrush常用笔刷_教您在ZBrush中制作笔刷
- 作为 Android 开发者,如何深入学习 Android UI?
- 软考网络工程师上午考试知识点总结整理
热门文章
- python paramiko_Python Paramiko基本使用
- keil4怎么移植其他人的程序_裸机程序如何驱动硬件?
- 太阳能电池基本特性实验报告_太阳能电池特性测试实验报告
- python猜数字游戏简单-python猜数字游戏快速求解解决方案
- ubuntu安装软件依赖
- origin数据平滑_独门绝技!Origin挑战绘制细胞分化轨迹热图
- golang日志服务器_日志系统 | log/syslog (log) – Go 中文开发手册 - Break易站
- 显卡mx150和230哪个好_MX250显卡等于GTX1050?笔记本显卡MX250和MX150的区别对比
- 计算机辅助制造与cnc,ComputerAided Manufacturing CNC (计算机辅助制造数控).pdf
- 压缩视频 html5播放,将HTML5视频呈现为Canvas正在压缩图像