在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关键字是Java语言中的一种同步机制,用于解决多线程并发问题。在Java中,synchronized可以修饰静态方法和非静态方法,两者的锁机制不同。 非静态方法 ...
Java中的`synchronized`关键字是实现线程同步的关键机制,它保证了在多线程环境下,对共享资源的访问是互斥的,防止了数据竞争和不一致的问题。synchronized通过锁的概念来控制对代码块或方法的访问,分为两种形式:...
在Java编程语言中,`synchronized`关键字是一个至关重要的概念,尤其在多线程环境下,它用于控制对共享资源的并发访问,确保线程安全。本教程将深入讲解`synchronized`关键字及其在Java多线程中的应用。 一、...
在这个方法中,synchronized 关键字锁住了整个类,这样可以确保多线程环境下的线程平安。 synchronized 关键字是 Java 中解决线程同步问题的重要工具,但是需要正确的用法,否则将无法实现线程平安。在编写代码时,...
本文将深入探讨synchronized修饰方法在Java中的使用及其工作原理,并通过实例演示其应用。 1. **synchronized原理** synchronized基于Java的内置锁(也称为对象锁或 monitors)机制。当一个线程进入synchronized...
在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要机制,它确保了在多线程环境下,对共享资源的访问是安全的。本文将深入探讨`synchronized`关键字在同步静态方法和非静态方法上的异同。 首先,`...
在Java多线程编程中,synchronized关键字是一个重要的同步工具,它能确保共享资源在多线程环境下的安全访问。synchronized可以用来同步静态和非静态方法,从而实现线程间的互斥访问。以下是关于synchronized修饰方法...
Java 中的 synchronized 关键字是用来实现线程同步的,它可以用来修饰方法、代码块和静态方法,以确保在多线程环境下数据的一致性。 一、进程和线程的区别 在计算机中,每个运行着的 xxxx.exe 都是一个进程,而...
它可以修饰方法或代码块,以便在多线程环境中保护共享资源的安全。 1、修饰普通方法 synchronized关键字可以修饰普通方法,以便保护方法内的资源。例如: ```java private synchronized void synMethod() { // ...
Java中的多线程同步是通过对象锁机制来实现的,synchronized关键字正是这一机制的关键。它确保了在任何时刻,只有一个线程能够访问特定的共享资源,从而避免数据不一致的问题。本文将详细讲解Java线程的基本概念、...
- **用途**:访问控制修饰符,表示受保护成员,可以在当前类、子类和同一包中的其他类中访问。 35. **public** - **用途**:访问控制修饰符,表示公共成员,可以在任何地方访问。 36. **return** - **用途**...
### Java关键字分类解释 ...- **const/goto**: `const`和`goto`是保留关键字,在当前版本的Java中并未使用。 以上是Java关键字的主要分类及其简要介绍。熟练掌握这些关键字对于编写高质量的Java程序至关重要。
在Java编程语言中,`synchronized`关键字是一个非常重要的概念,它主要用于多线程环境中的线程同步,确保共享资源的正确访问,防止数据不一致性。以下是对`synchronized`关键字使用方法的详细讲解: 1. **修饰实例...
Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够正确地按照预定顺序进行,防止数据不一致性和线程安全问题。本篇将深入探讨`synchronized`修饰...
Java关键字和命名规范是Java编程语言中的基础概念,它们对于编写清晰、规范的代码至关重要。Java关键字是Java语言内置的、具有特殊用途的保留字,而命名规范则是关于如何给类、方法、变量等命名的约定。 ### Java...
Java关键字在编程中起着至关重要的作用,它们是语言预定义的标识符,具有特定的含义,不能用于命名变量、方法、类、包或参数。本文将深入解析几个关键的Java关键字及其用法。 首先,`instanceof`关键字用于判断一个...
50. **volatile** - 用于共享变量,确保多线程环境中的可见性和顺序一致性。 51. **while** - 循环结构,先检查条件再执行循环体。 以上就是Java的48个关键字的概述,它们构成了Java编程的基础,理解并熟练掌握...
在Java编程语言中,同步是多线程编程中的一个关键概念,用于控制对共享资源的访问,以防止数据不一致性和竞态条件。本篇文章将深入探讨“静态方法同步”与“非静态方法同步”的差异、应用场景以及它们如何影响程序的...
47. `volatile`: 修饰符,确保多线程环境下的可见性和不被优化,保证变量在不同线程间的一致性。 48. `while`: 创建while循环,当条件为真时持续执行循环体。 这些关键字是构建Java程序的基础,理解并熟练运用它们...
49. **volatile**:修饰字段,确保多线程环境下的可见性和不被优化。 50. **while**:用于循环,只要条件为真就继续执行。 了解并熟练掌握这些关键字对于编写高质量的Java代码至关重要。HTML制作的文档使得这些...