`

实验java中 synchronized 的使用

阅读更多

实验java中synchronized的使用

1  首先我们创建一个测试类TestSync

在TestSync中创建一个内部类Worker实现Runnable接口

 class Worker implements Runnable{
  int index = 1;
  @Override
  public void run() {
   int runIndex = index;
   index++;
   System.out.println("非同步块,顺序执行");
   try {
    if(runIndex == 1){
     Thread.sleep(3000);
    }
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   System.out.println("线程计数, 第 "+runIndex+"次执行");
  }
 }

 
 
2 再写一个 print方法,此方法创建一个worker对象,并使用两个线程去执行
 

public void print(){
  Worker worker = new Worker();
  new Thread(worker).start();
  new Thread(worker).start();
 }

 

3 添加main方法 执行 print方法

 public static void main(String[] args) throws Exception{
  TestSync testSync = new TestSync();
  testSync.print();
 }

 
 
4完整的 类代码如下:

 

package com.jshand.thread;

public class TestSync {

 public void print() {
  Worker worker = new Worker();
  new Thread(worker).start();
  new Thread(worker).start();
 }

 class Worker implements Runnable {
  int index = 1;

  @Override
  public void run() {
   int runIndex = index;
   index++;
   System.out.println("非同步块,顺序执行");
   try {
    if (runIndex == 1) {
     Thread.sleep(3000);
    }
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   System.out.println("线程计数, 第 " + runIndex + "次执行");
  }
 }

 public static void main(String[] args) throws Exception {
  TestSync testSync = new TestSync();
  testSync.print();
 }
}

 
5 执行后 打印的结果如下:

 

非同步块,顺序执行
非同步块,顺序执行
线程计数, 第 2次执行
//执行此处时会等待大约3秒钟后才执行下面一句话,并且发现线程第二次的会先于第一次的执行完。
线程计数, 第 1次执行


6 下面 我们将Worker线程类 的run方法改造一下 ,添加一个同步块,也就是synchronized 块 run方法如下

  public void run() {
   int runIndex = index;
   index++;
   System.out.println("非同步块,顺序执行");
   synchronized (this) {
    try {
     if(runIndex == 1){
      Thread.sleep(3000);
     }
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    System.out.println("线程计数, 第 "+runIndex+"次执行");
   }
  }

 

 

7 再次执行下结果如下:
非同步块,顺序执行
非同步块,顺序执行
//执行到此处会发现等待三秒后才执行线程1 的打印,线程1的计数打印完毕后才执行线程2的计数打印。
线程计数, 第 1次执行
线程计数, 第 2次执行


总结:
通过 第5步骤和第7步骤 对比发现,添加同步块的代码只有上一个线程执行完毕后才会允许下一个线程继续执行,
也就是给这个代码块添加了锁,只有线程执行完毕,释放了锁后才允许其他线程获得锁

上述执行代码是我自己试验的结果,总结部分是我自己的理解,不对之处希望大家指正和完善。

 

 

分享到:
评论

相关推荐

    Java synchronized使用案例

    在`Synchronized`压缩包中,可能包含了通过实验来演示`synchronized`关键字使用的一些Java代码。例如,创建一个共享资源类,然后通过多个线程去操作这个资源,使用`synchronized`关键字来保证线程安全。实验可能涉及...

    操作系统实验java版

    在“操作系统实验java版”中,我们将探讨如何使用Java语言来实现操作系统的一些关键概念和技术。以下是对这些主题的详细解释: 1. 进程调度: 在操作系统中,进程调度是决定哪个进程在何时获得CPU执行权的过程。...

    java实验报告(本人亲手完成的一份JAVA试验报告册)

    Java提供了丰富的多线程支持,实验中可能会创建并运行多个线程,探索同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Thread类和Runnable接口的区别。此外,线程池的使用也是实验的重点。 ...

    详解Java中synchronized关键字的死锁和内存占用问题

    总之,理解和合理使用`synchronized`关键字是Java多线程编程中的基础,但同时也要注意避免潜在的死锁问题和过度使用导致的内存占用问题。正确选择同步机制,结合适当的并发工具,能够有效地提高多线程程序的效率和...

    java实验答案及实验报告书

    6. **多线程**:Java对多线程支持良好,实验可能会让学生编写并发程序,理解synchronized关键字、Thread类和Runnable接口,以及线程通信(wait、notify)。 7. **网络编程**:Java提供了Socket编程接口,实验可能...

    JAVA实验&实验报告&实验指导书

    在"JAVA实验&实验报告&实验指导书"中,学生或学习者可以深入理解并实践Java的核心概念和技术。以下是对这些主题的详细阐述: 1. 用户自定义绘图:Java提供了丰富的图形用户界面(GUI)工具,如Java AWT(Abstract ...

    吉林大学《Java程序设计》实验(所有)

    6. **多线程**:Java支持并发编程,学生将学习如何创建和管理线程,理解同步和互斥的概念,以及使用synchronized关键字和wait()、notify()方法。 7. **图形用户界面GUI**:通过Swing或JavaFX库创建交互式的图形界面...

    java实验代码及实验报告(哈理工)

    Java实验是计算机科学教育中一个重要的实践环节,它旨在帮助学生深入理解面向对象编程的概念,掌握Java语言的基本语法和特性。在哈尔滨理工大学的Java实验课程中,学生通常会被要求完成一系列编程任务,通过编写代码...

    JAVA实验典型举例

    这些例子可能会演示如何在实际场景中使用它们,比如存储和操作数据。我们可以通过查看代码了解它们各自的特点和适用场景。 线程是Java中的并发编程基础。在实验中,可能会有创建和管理线程的例子,比如使用Thread类...

    java实验报告很齐全的

    6. **多线程**:Java支持并发编程,实验报告会讲解线程的创建、同步、通信等,如Thread类、Runnable接口、synchronized关键字、wait()、notify()方法的使用。 7. **网络编程**:Java提供Socket编程接口,可以进行...

    《JAVA》实验大纲

    在Java编程的学习过程中,实验是至关重要的环节,它能帮助我们深入理解理论知识,并将其转化为实际操作能力。以下是对这个实验大纲的详细解析。 实验一:Java环境配置与 HelloWorld 程序 在这个实验中,学生将学习...

    Java基础实验 非常适合Java初学者用的实验文档

    函数是Java中的重要组成部分,允许我们将代码组织成可重复使用的模块。初学者应掌握如何定义和调用函数,理解参数传递以及返回值的概念。同时,类与对象是面向对象编程的基础,理解封装、继承和多态等概念是进阶的...

    Java-Java实验指导书

    Java实验是学习Java编程语言的重要环节,通过实践可以加深对理论知识的理解,提高编程技能。这份"Java实验指导书"涵盖了多个关键知识点,旨在帮助初学者和进阶者巩固Java编程基础。 首先,实验可能从基础语法开始,...

    java 课程设计实验报告

    Java课程设计实验报告是学生在学习Java编程语言过程中,通过实际操作和编程,对特定问题进行解决并撰写的一份详细报告。这份报告通常包括实验目的、实验环境、实验内容、实验步骤、实验结果分析和实验总结等多个部分...

    Java实验指导书_参考答案

    实验中会介绍Thread类和Runnable接口的使用,以及线程同步机制(如synchronized关键字、wait()、notify()、notifyAll()方法)的应用,帮助理解并发执行的概念。 七、Java Swing和AWT Swing和AWT是Java图形用户界面...

    Java实验报告配套Java程序设计基础(第3版)实验指导书使用

    - 实验目标是理解Java中的基本数据类型,包括整型(byte, short, int, long)、浮点型(float, double)、字符型(char)和布尔型(boolean)。同时,学习如何使用算术运算符进行计算,逻辑运算符进行条件判断,...

    java 常用实验代码

    实验中,你将学习如何创建和管理线程,理解线程同步和通信的概念,如synchronized关键字和wait/notify机制。 8. **简单计算器**: 最后一个实验是一个简单的计算器程序,可能涉及到用户输入处理、基本算术运算和...

    吉林大学Java程序设计实验报告

    本次实验旨在让学生熟悉Java开发环境,包括安装Java Development Kit (JDK)、设置环境变量以及使用集成开发环境(IDE)如Eclipse或IntelliJ IDEA。实验报告将详细介绍每个步骤,确保初学者能够成功搭建Java编程平台。 ...

    java2实验教程第6版实验指导书

    《Java2实验教程第6版实验指导书》是学习Java编程的重要参考资料,尤其对于初学者而言,它提供了丰富的实践案例和详细的步骤指南。本教程涵盖了Java语言的基础到进阶内容,通过不同章节的设计,帮助读者逐步掌握编程...

Global site tag (gtag.js) - Google Analytics