`

j在多线程中java关键字synchronized的修饰静态方法和非静态方法得到的不同情况

阅读更多

在java的同步关键字synchronized  我们知道用在多线程同步并发情况下,用来在修饰方法或者代码块上

修饰方法 监视的是整个对象 那么如果修饰的分别是静态方法和非静态方法呢 ,效果一样吗?

下面请看我这个例子

 

package com.test.thread;

public class SynchronizedClass {
   
   /**
	* 非静态 synchroized 方法
 * @throws InterruptedException 
   */
 public  synchronized void nonStaticFunction1() throws InterruptedException{
	for(int i=0;i<20;i++ ){
		Thread.sleep(300);
		System.out.println("nonstaticFunc1 is  running  times"+i);
	}	 
 }	
 /**
  * 非静态 synchroized 方法
 * @throws InterruptedException 
  */
 public  synchronized void nonStaticFunction2() throws InterruptedException{
		for(int i=0;i<20;i++ ){
			Thread.sleep(300);
			System.out.println("nonstaticFunc2 is  running  times"+i);
		}	 
 }
 /**
  * 静态 synchroized 方法
 * @throws InterruptedException 
  */
 public static synchronized void staticFunction() throws InterruptedException{
		for(int i=0;i<20;i++ ){
			Thread.sleep(300);
			System.out.println("staticFunc2 is  running  times"+i);
		}	 
 
 }
}

  下面是测试代码

 

package com.test.thread;

public class SynchronizedTest {
  
	public static void main(String[] args) throws InterruptedException {
		final SynchronizedClass cls= new SynchronizedClass();
	    Thread t1=new Thread(){
	    	public void run() {
	    		try {
					cls.nonStaticFunction1();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	    	};
	    };
	    
	    Thread t2=new Thread(){
	    	public void run() {
	    		try {
					cls.nonStaticFunction2();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	    	};
	    };
	    Thread t3=new Thread(){
	    	public void run() {
	    		try {
					cls.staticFunction();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	    	};
	    };
	    t1.start();
	    t2.start();
	    t3.start();
	}
	
	
}

  运行结果 如下

nonstaticFunc1 is  running  times0
staticFunc2 is  running  times0
staticFunc2 is  running  times1
nonstaticFunc1 is  running  times1
staticFunc2 is  running  times2
nonstaticFunc1 is  running  times2
staticFunc2 is  running  times3
nonstaticFunc1 is  running  times3
staticFunc2 is  running  times4
nonstaticFunc1 is  running  times4
staticFunc2 is  running  times5
nonstaticFunc1 is  running  times5
staticFunc2 is  running  times6
nonstaticFunc1 is  running  times6
staticFunc2 is  running  times7
nonstaticFunc1 is  running  times7
staticFunc2 is  running  times8
nonstaticFunc1 is  running  times8
staticFunc2 is  running  times9
nonstaticFunc1 is  running  times9
staticFunc2 is  running  times10
nonstaticFunc1 is  running  times10
staticFunc2 is  running  times11
nonstaticFunc1 is  running  times11
staticFunc2 is  running  times12
nonstaticFunc1 is  running  times12
staticFunc2 is  running  times13
nonstaticFunc1 is  running  times13
staticFunc2 is  running  times14
nonstaticFunc1 is  running  times14
staticFunc2 is  running  times15
nonstaticFunc1 is  running  times15
staticFunc2 is  running  times16
nonstaticFunc1 is  running  times16
staticFunc2 is  running  times17
nonstaticFunc1 is  running  times17
staticFunc2 is  running  times18
nonstaticFunc1 is  running  times18
staticFunc2 is  running  times19
nonstaticFunc1 is  running  times19
nonstaticFunc2 is  running  times0
nonstaticFunc2 is  running  times1
nonstaticFunc2 is  running  times2
nonstaticFunc2 is  running  times3
nonstaticFunc2 is  running  times4
nonstaticFunc2 is  running  times5
nonstaticFunc2 is  running  times6
nonstaticFunc2 is  running  times7
nonstaticFunc2 is  running  times8
nonstaticFunc2 is  running  times9
nonstaticFunc2 is  running  times10
nonstaticFunc2 is  running  times11
nonstaticFunc2 is  running  times12
nonstaticFunc2 is  running  times13
nonstaticFunc2 is  running  times14
nonstaticFunc2 is  running  times15
nonstaticFunc2 is  running  times16
nonstaticFunc2 is  running  times17
nonstaticFunc2 is  running  times18
nonstaticFunc2 is  running  times19

  

由上述运行结果可知 静态方法staticFunc2 和 非静态方法nonstaticFunc1 交替执行,而非静态方法 nonstaticFunc1 和nonstaticFunc2两方法则是有先后顺序执行的 说明

静态方法和非静态方法监视的对象不一样,我们知道静态方法属于类对象 那么它监视的对象就是Class类了,而非静态方法属于对象本身 那么他监视的对象就是对象本身了

 

 

 

分享到:
评论

相关推荐

    基于synchronized修饰静态和非静态方法

    基于synchronized修饰静态和非静态方法 synchronized关键字是Java语言中的一种同步机制,用于解决多线程并发问题。在Java中,synchronized可以修饰静态方法和非静态方法,两者的锁机制不同。 非静态方法 ...

    java关键字Synchronized详解

    Java中的`synchronized`关键字是实现线程同步的关键机制,它保证了在多线程环境下,对共享资源的访问是互斥的,防止了数据竞争和不一致的问题。synchronized通过锁的概念来控制对代码块或方法的访问,分为两种形式:...

    java基本教程之synchronized关键字java多

    在Java编程语言中,`synchronized`关键字是一个至关重要的概念,尤其在多线程环境下,它用于控制对共享资源的并发访问,确保线程安全。本教程将深入讲解`synchronized`关键字及其在Java多线程中的应用。 一、...

    实例解析Java中的synchronized关键字与线程平安问题_.docx

    在这个方法中,synchronized 关键字锁住了整个类,这样可以确保多线程环境下的线程平安。 synchronized 关键字是 Java 中解决线程同步问题的重要工具,但是需要正确的用法,否则将无法实现线程平安。在编写代码时,...

    Java使用synchronized修饰方法来同步线程的实例演示

    本文将深入探讨synchronized修饰方法在Java中的使用及其工作原理,并通过实例演示其应用。 1. **synchronized原理** synchronized基于Java的内置锁(也称为对象锁或 monitors)机制。当一个线程进入synchronized...

    java synchronized同步静态方法和同步非静态方法的异同

    在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要机制,它确保了在多线程环境下,对共享资源的访问是安全的。本文将深入探讨`synchronized`关键字在同步静态方法和非静态方法上的异同。 首先,`...

    Java中synchronized关键字修饰方法同步的用法详解

    在Java多线程编程中,synchronized关键字是一个重要的同步工具,它能确保共享资源在多线程环境下的安全访问。synchronized可以用来同步静态和非静态方法,从而实现线程间的互斥访问。以下是关于synchronized修饰方法...

    java synchronized 学习

    Java 中的 synchronized 关键字是用来实现线程同步的,它可以用来修饰方法、代码块和静态方法,以确保在多线程环境下数据的一致性。 一、进程和线程的区别 在计算机中,每个运行着的 xxxx.exe 都是一个进程,而...

    Java中的关键字synchronized 详解

    它可以修饰方法或代码块,以便在多线程环境中保护共享资源的安全。 1、修饰普通方法 synchronized关键字可以修饰普通方法,以便保护方法内的资源。例如: ```java private synchronized void synMethod() { // ...

    深入讲解java线程与synchronized关键字

    Java中的多线程同步是通过对象锁机制来实现的,synchronized关键字正是这一机制的关键。它确保了在任何时刻,只有一个线程能够访问特定的共享资源,从而避免数据不一致的问题。本文将详细讲解Java线程的基本概念、...

    java关键字、保留字

    - **用途**:访问控制修饰符,表示受保护成员,可以在当前类、子类和同一包中的其他类中访问。 35. **public** - **用途**:访问控制修饰符,表示公共成员,可以在任何地方访问。 36. **return** - **用途**...

    Java关键字分类解释

    ### Java关键字分类解释 ...- **const/goto**: `const`和`goto`是保留关键字,在当前版本的Java中并未使用。 以上是Java关键字的主要分类及其简要介绍。熟练掌握这些关键字对于编写高质量的Java程序至关重要。

    举例讲解Java中synchronized关键字的用法

    在Java编程语言中,`synchronized`关键字是一个非常重要的概念,它主要用于多线程环境中的线程同步,确保共享资源的正确访问,防止数据不一致性。以下是对`synchronized`关键字使用方法的详细讲解: 1. **修饰实例...

    Java多线程程序中synchronized修饰方法的使用实例

    Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够正确地按照预定顺序进行,防止数据不一致性和线程安全问题。本篇将深入探讨`synchronized`修饰...

    java关键字和java命名规范.pdf

    Java关键字和命名规范是Java编程语言中的基础概念,它们对于编写清晰、规范的代码至关重要。Java关键字是Java语言内置的、具有特殊用途的保留字,而命名规范则是关于如何给类、方法、变量等命名的约定。 ### Java...

    Java关键字解析.pdf

    Java关键字在编程中起着至关重要的作用,它们是语言预定义的标识符,具有特定的含义,不能用于命名变量、方法、类、包或参数。本文将深入解析几个关键的Java关键字及其用法。 首先,`instanceof`关键字用于判断一个...

    Java关键字

    50. **volatile** - 用于共享变量,确保多线程环境中的可见性和顺序一致性。 51. **while** - 循环结构,先检查条件再执行循环体。 以上就是Java的48个关键字的概述,它们构成了Java编程的基础,理解并熟练掌握...

    静态方法同步 与 非静态方法同步

    在Java编程语言中,同步是多线程编程中的一个关键概念,用于控制对共享资源的访问,以防止数据不一致性和竞态条件。本篇文章将深入探讨“静态方法同步”与“非静态方法同步”的差异、应用场景以及它们如何影响程序的...

    java关键字大全及解释

    47. `volatile`: 修饰符,确保多线程环境下的可见性和不被优化,保证变量在不同线程间的一致性。 48. `while`: 创建while循环,当条件为真时持续执行循环体。 这些关键字是构建Java程序的基础,理解并熟练运用它们...

    JAVA关键字

    49. **volatile**:修饰字段,确保多线程环境下的可见性和不被优化。 50. **while**:用于循环,只要条件为真就继续执行。 了解并熟练掌握这些关键字对于编写高质量的Java代码至关重要。HTML制作的文档使得这些...

Global site tag (gtag.js) - Google Analytics