`
avi2
  • 浏览: 90364 次
社区版块
存档分类
最新评论

[转]java synchronized 的用法

    博客分类:
  • java
阅读更多
synchronized 的语法:
synchronized 可以作为一个method的修饰符,也可以一段代码里出现,先说在代码里出:
  其语法是
    synchronized(xx) {
    //your code
   }

   这个xx需要是一个Object,只要是一个Object就行,如:
        String s="haha";
        synchronized(s) {
           //your code
        }


   不是Object不行,如:
        int n=3;
        synchronized(n) {
                //your code
        }


   是不可以的,有autoboxing也不行。
   如果你理解this的含义,那么
    synchronized(this) {
        //your code
    }


   也很好理解,它需要一个Object,而this是一个特殊的Object,当然可以这样用。
再说synchronized 修饰 method的情况,如果synchronized修饰一个非static的method,
如:
    public synchronized void aMethod() {
        //some code
    }


相当于:
    public void aMethod() {
        synchronized(this) {
           //some code
        }
    }

修饰一个 static的method,
如:
    public static synchronized void aMethod() {
        //some code
    }

相当于:
    public static synchronized void aMethod() {
        synchronized(XX.class) {
           //some code
        }
    }


XX是这个方法所在的类,XX.class 也是一个Object,类型是Class而已,在一个
ClassLoader里,它是唯一的,就是独一无二的object
    总之synchronized的语法可以统一为: synchronized(a var) { do something }


synchronized 的语义:
这是我自己的理解,
   synchronized(xx) {
      //your code
   }
的语义是,在xx这个Object的“授权”、“名义”、 “面子”下,执行 your code。要注
意的是,xx只能授权给一个人(线程),当xx授权给某个人执行后,就不能再授权给别人了
。 当那个人执行完那段代码后,xx才能继续授权给其它人执行,可以理解为,别人在xx的
授权下,执行完这段代码后,把这个权利又还给xx了。 当xx不能授权给一个人时,这个人
必须等在这里,知道xx可以授权给它。 (上面说的人都是线程)


synchronized 的作用:
synchronized是用在多线程环境中的,作用简单的说,就是不允许 “某些” 线程 同时执
行到一段代码里。 这个 “某些”线程 怎么界定? 是由那个xx object决定的,就是当两
个线程执行到 synchronized的时候,需要同一个Object授权时,这两个线程不能同时执行
到需要授权的代码。
  极端情况是 系统你所有的线程都不能执行到这段代码里,那么你就选一个极端唯一的
object作为xx,一般选Class object,如:
synchronized(String.class) {
}

具体到应用比较复杂,举两个例子:
1:
public class Test1 implements Runnable {

    public void run() {
        synchronized(this) {
            try {
                System.out.println(System.currentTimeMillis());
                Thread.sleep(2000);
                System.out.println(System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Test1 test=new Test1();
        for(int i=0;i<10;i++) {
            new Thread(test).start();
        }
    }
}


2:
public class Test1 implements Runnable {

    public void run() {
        synchronized(this) {
            try {
                System.out.println(System.currentTimeMillis());
                Thread.sleep(2000);
                System.out.println(System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        for(int i=0;i<10;i++) {
            new Thread(new Test1()).start();
        }
    }
}


两个例子中,都有一段synchronized的代码。
在1中,main方法中创建的10个线程 不能同时进入到那段代码执行,因为这10个线程需要让
同一个object授权

在2中,main方法中创建的10个线程 可以同时进入到那段代码执行,因为10个线程是让不同
的object授权的,均授权成功,同时进入到那段代码执行
分享到:
评论

相关推荐

    java中synchronized用法

    "Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,...

    java里面synchronized用法.doc

    Java 中的 synchronized 用法详解 Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized ...

    java同步synchronized关键字用法示例

    - **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...

    Java synchronized使用案例

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

    java synchronized demo

    本示例"java synchronized demo"旨在探讨`synchronized`关键字的用法及其作用机制。下面将详细阐述`synchronized`的相关知识点。 1. **synchronized的作用**: - `synchronized`关键字主要用于解决多线程环境中的...

    java锁机制Synchronizedjava锁机制Synchronized

    "Java 锁机制 Synchronized" Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被...

    Java synchronized详细解读.docx

    Java中的`synchronized`关键字是多线程编程中用于同步控制的关键元素,它的主要目标是解决并发环境下多个线程对共享资源的访问冲突。在Java中,由于线程共享内存空间,如果没有适当的同步机制,可能会导致数据不一致...

    synchronized用法大全实例

    本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ### 1. 同步方法 同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该...

    [JAVA][synchronized的使用]

    `synchronized`关键字在Java中提供了互斥访问,也就是说,当一个线程进入一个对象的`synchronized`代码块或方法时,其他线程对这个对象的`synchronized`代码块或方法的访问将会被阻塞,直到当前线程执行完毕并释放...

    Java synchronized关键_动力节点Java学院整理

    1. **对象锁**:每个Java对象都可以作为一个锁,当调用对象的`synchronized`方法或在代码块中使用`synchronized`关键字时,会获取到这个对象的锁。如果多个线程尝试访问同一个对象的同步代码,只有一个线程能够获得...

    Java中synchronized正确使用方法解析

    Java 中 synchronized 正确使用方法解析 Java 中 synchronized 关键字是解决线程安全问题的重要手段,它可以确保在多线程环境下,共享资源的访问安全性。本文将详细介绍 Java 中 synchronized 的正确使用方法,通过...

    synchronized关键字的用法详解

    `synchronized`关键字有两种主要的使用方式:一种是在方法声明中使用,另一种则是在代码块中使用。 ##### 1. synchronized方法 在方法声明中添加`synchronized`关键字,可以将整个方法体变成同步代码块。例如: `...

    基于Java synchronized同步锁实现线程交互.pdf

    "基于Java synchronized同步锁实现线程交互" Java多线程能够提高CPU利用...因此,在使用Java多线程的场景中,请充分理解Java线程各状态之间的关系及其切换,并使用synchronized、wait()和notify()方法实现线程交互。

    java_synchronized详解

    通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个线程能访问这些代码区域,从而有效避免了多线程环境下的数据竞争和不一致性问题。 #### 二、synchronized的作用机制 `synchronized`主要通过对象...

    Java 中 synchronized的用法详解(四种用法)

    理解 `synchronized` 的工作原理和用法对于编写线程安全的 Java 代码至关重要。然而,过度使用 `synchronized` 可能会导致性能下降,因为它会阻塞线程。因此,开发者需要谨慎地权衡同步的粒度,尽可能减少锁的范围,...

    java synchronized 学习

    六、synchronized 同步锁概念及使用方法 Synchronized 同步锁的作用是解决多线程访问实例变量时可能造成的数据脏读现象。Synchronized 的使用方法有四种: 1. synchronized 修饰普通方法 2. synchronized 修饰普通...

    JAVA synchronized详解

    通过使用`synchronized`,可以确保同一时刻只有一个线程能够访问被标记为同步的方法或代码块,从而避免多线程环境下的数据不一致问题。 #### 一、基本概念 `synchronized`关键字主要具有以下特性: 1. **互斥性**...

    java的lock和synchronized的区别.docx

    Java 中的 Lock 和 Synchronized 的区别 Java 语言中有很多相似关键字或相似意义的字,但 lock 和 synchronized 是两个最容易混淆的关键字。它们都是锁的意思,都是为了线程安全性、应用合理性和运行效率的。下面...

    java synchronized详解

    每个Java对象都可以作为锁,当线程访问`synchronized`方法或同步代码块时,都会获取到对应的锁。对于实例方法,锁是当前对象实例;对于静态方法,锁是该类的Class对象。 5. **进入和退出同步块的规则** - **线程...

Global site tag (gtag.js) - Google Analytics