`

实验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使用案例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...

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

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

    操作系统实验java版

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

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

    Java中的`synchronized`关键字是用于实现线程同步的重要机制,其主要目的是确保多线程环境下的数据一致性与安全性。在Java中,`synchronized`可以应用于方法或代码块,以控制对共享资源的访问。 首先,`...

    java实验报告很齐全的

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

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

    3. 用户自定义类:在Java中,通过class关键字可以定义自己的类,扩展Java内置类型或实现特定功能。理解类的构造函数、封装、继承和多态性是OOP(面向对象编程)的基础。 4. 系统类的应用:Java标准库提供了一系列的...

    java实验答案及实验报告书

    8. **IO与NIO**:Java的IO流系统和新的NIO(New IO)框架也是实验内容,包括缓冲区、选择器和通道的使用。 9. **设计模式**:实验可能要求应用常见的设计模式,如单例、工厂、观察者等,以解决实际问题。 10. **...

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

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

    JAVA实验典型举例

    线程是Java中的并发编程基础。在实验中,可能会有创建和管理线程的例子,比如使用Thread类或者实现Runnable接口。理解线程的同步和通信机制,如synchronized关键字和wait/notify机制,是提升程序性能的关键。 此外...

    java实验集合

    7. **字符串处理**:String类在Java中广泛使用,实验会涉及字符串的创建、比较、截取、替换等操作,以及StringBuffer或StringBuilder类的高效字符串拼接。 8. **接口与抽象类**:接口是完全抽象的,只能包含常量和...

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

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

    Java实验6多线程.doc

    在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。在改写聊天程序时,可能需要为每个连接到服务器的客户端创建一个新的线程。例如,可以创建一个名为`ClientThread`的类,该类继承`Thread...

    Java-Java实验指导书

    文件输入输出(IO)操作是Java中的一个重要主题。Java提供了丰富的IO流类库,允许程序读写文件、标准输入/输出以及网络流。理解字节流和字符流的区别,以及如何使用BufferedReader和PrintWriter进行文本处理,将对...

    java实验报告(所有的完整的)

    2. **异常处理**:理解Java中的异常机制,学习如何使用try-catch-finally语句块来捕获和处理程序运行时可能出现的错误。 3. **集合框架**:包括ArrayList、LinkedList、HashMap、HashSet等容器的使用,理解它们的...

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

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

    《JAVA》实验大纲

    在此实验中,学生将学习如何声明、初始化和操作数组,以及了解单列集合(如ArrayList和LinkedList)和双列集合(如HashMap和HashSet)的使用。通过处理数组和集合数据,培养学生的数据组织和处理能力。 实验五:...

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

    《吉林大学《Java程序设计》实验(所有)》是一份包含2012年小学期吉林大学《Java程序设计》课程所有实验作业的资源集合,旨在帮助学生深入理解和掌握Java编程语言的核心概念与技术。这份压缩包文件名为“WangKai_...

    Java实验指导书_参考答案

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

    java 高级开发的课后实验报告

    通过这些实验,学生将不仅掌握Java语言的基本语法,还能深入理解其高级特性的使用,为实际项目开发打下坚实基础。同时,实验过程中的问题解决和调试能力也是软件工程师必备的技能之一。不断实践和迭代,是成为Java...

    java 常用实验代码

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

Global site tag (gtag.js) - Google Analytics