题目代码如下,问题:程序的输出结果?

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多线程一个有趣的题目相关推荐

  1. java 多线程变量可见性_Java多线程:易变变量,事前关联和内存一致性

    java 多线程变量可见性 什么是volatile变量? volatile是Java中的关键字. 您不能将其用作变量或方法名称. 期. 我们什么时候应该使用它? 哈哈,对不起,没办法. 当我们在多线程 ...

  2. java 线程面试题_JAVA多线程面试题(一)

    1.进程和线程的区别 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进 ...

  3. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  4. java 多线程并发 问题_JAVA多线程和并发基础面试问答

    原文链接 译文连接作者:Pankaj  译者:郑旭东  校对:方腾飞 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌 ...

  5. java 锁旗标_Java多线程

    Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...

  6. java线程怎么用_Java多线程基本使用

    一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...

  7. java 多线程 并发实例_Java 多线程(并发)

    线程释义 使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义.实例化和启动新线程. 一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具 ...

  8. java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...

  9. java线程池 锁_java多线程——锁

    这是多线程系列第四篇,其他请关注以下: 如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍. ...

最新文章

  1. time 和 datetime 模块
  2. css中的三种基本定位机制
  3. 连咖啡首席产品经理左弘帆:all in小程序前你想清楚了吗?
  4. quad8是matlab中调用那个,Matlab 数值积分
  5. [导入]关于复制目录架构
  6. OpenJudge计算概论-找出第k大的数
  7. java class 字符串_java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer...
  8. 摸鱼也要讲究方法:工作学习中玩手机并不能缓解无聊和疲劳
  9. linux定时备份前一天,linux定时备份
  10. 重磅推出Android4开发系列精品课程
  11. 【爷青回系列】使用VMware虚拟机安装Windows XP系统!最详细!
  12. 服务器版dll修复工具,DLL修复工具哪个好?五款修复能力强推荐
  13. matlab读取本地图片,matlab读取图片
  14. 小米手机WIFI显示已连接,但无法访问互联网,新路由器其他设备都能连
  15. ORA-39194: Table mode jobs require the tables to be comma separated.
  16. 【观察】华为云:决胜拉美市场“正当时”,做出海企业的“好帮手”
  17. fuzzy extractor 模糊提取器的代码解读和实现
  18. zbrush常用笔刷_教您在ZBrush中制作笔刷
  19. 作为 Android 开发者,如何深入学习 Android UI?
  20. 软考网络工程师上午考试知识点总结整理

热门文章

  1. python paramiko_Python Paramiko基本使用
  2. keil4怎么移植其他人的程序_裸机程序如何驱动硬件?
  3. 太阳能电池基本特性实验报告_太阳能电池特性测试实验报告
  4. python猜数字游戏简单-python猜数字游戏快速求解解决方案
  5. ubuntu安装软件依赖
  6. origin数据平滑_独门绝技!Origin挑战绘制细胞分化轨迹热图
  7. golang日志服务器_日志系统 | log/syslog (log) – Go 中文开发手册 - Break易站
  8. 显卡mx150和230哪个好_MX250显卡等于GTX1050?笔记本显卡MX250和MX150的区别对比
  9. 计算机辅助制造与cnc,ComputerAided Manufacturing CNC (计算机辅助制造数控).pdf
  10. 压缩视频 html5播放,将HTML5视频呈现为Canvas正在压缩图像