`
gujian123456
  • 浏览: 2171 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

synchronized(this)与synchronized(class)

    博客分类:
  • java
阅读更多

 

 synchronized(class)很特别,它会让另一个线程在任何需要获取class做为monitor的地方等待.class与this做为不同的监视器可以同时使用,不存在一个线程获取了class,另一个线程就不能获取该class的一切实例.

根据下面的代码自行修改,分别验证下面的几种情况:

synchronized(class)

synchronized(this)

->线程各自获取monitor,不会有等待.

synchronized(this)

synchronized(this)

->如果不同线程监视同一个实例对象,就会等待,如果不同的实例,不会等待.

synchronized(class)

synchronized(class)

->如果不同线程监视同一个实例或者不同的实例对象,都会等待.package thread.sync;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class RunnableTest implements Runnable {

private static boolean flag = true;

// private static synchronized void testSyncMethod() { // 注意static修改的同步方法,监视器=class

// for (int i = 0; i < 100; i++) {

// System.out.println("testSyncMethod:" + i);

// }

// }

private void testSyncMethod() {

synchronized (this) {

for (int i = 0; i < 100; i++) {

System.out.println("testSyncMethod:" + i);

}

}

}

private void testSyncBlock() {

synchronized (this) { // 注意this做为监视器.它与class分别是二个不同监视器.不会存在class被获取,this就要等的现象.这也是我以前关于监视器的一个误区.

for (int i = 0; i < 100; i++) {

System.out.println("testSyncBlock:" + i);

}

}

// synchronized (RunnableTest.class) { // 显示使用获取class做为监视器.它与static synchronized method隐式获取class监视器一样.

// for (int i = 0; i < 100; i++) {

// System.out.println("testSyncBlock:" + i);

// }

// }

}

public void run() {

// flag是static的变量.所以,不同的线程会执行不同的方法,只有这样才能看到不同的锁定效果.

if (flag) {

flag = false;

testSyncMethod();

} else {

flag = true;

testSyncBlock();

}

}

public static void main(String[] args) {

ExecutorService exec = Executors.newFixedThreadPool(2);

RunnableTest rt = new RunnableTest();

RunnableTest rt1 = new RunnableTest();

exec.execute(rt);

exec.execute(rt1);

exec.shutdown();

}

}

转载请保留出处:http://www.01yun.com/Java/20130719/593105.html

分享到:
评论

相关推荐

    java中synchronized用法

    在 Java 中,synchronized 关键字可以作用于 instance 变量、object reference(对象引用)、static 函数和 class literals(类名称字面常量)身上。 Synchronized 关键字的作用是取得对象的锁,而不是把一段代码或...

    java里面synchronized用法.doc

    synchronized (this) { // ... } } } ``` 在上面的例子中,synchronized 关键字被用于代码块中,以实现对当前对象的互斥访问控制。 三、synchronized 关键字的继承 synchronized 关键字不能被继承,即基类的 ...

    synchronized的几种示例

    本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法加锁。 1. **方法加锁** 当在实例方法前使用`synchronized`关键字时,它会锁定当前对象的监视器,只有...

    java_synchronized详解

    - 如果一个线程正在访问对象的`synchronized(this)`同步代码块,其他线程仍然可以访问该对象的非`synchronized(this)`代码块。例如: ```java package ts; public class Thread2 { public void m4t1() { ...

    synchronized用法大全实例

    synchronized (this) { balance += amount; } } public void withdraw(double amount) { synchronized (this) { if (balance &gt;= amount) { balance -= amount; } else { System.out.println(...

    Android synchronized 测试案例

    本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及成功与失败的场景对比。 一、`synchronized`关键字的基本概念 `synchronized`关键字可以修饰方法或用作代码块,其主要作用是...

    JAVA synchronized详解

    synchronized (this) { for (int i = 0; i ; i++) { System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); } } } public static void main(String[] args) { Thread1 t1 = ...

    synchronized关键字的用法详解

    以下是一个具体的示例程序,用于演示多个线程访问同一个对象的`synchronized(this)`同步代码块时的行为。 ```java package threads; public class Thread1 implements Runnable { public void run() { ...

    Synchronized与ThreadLocal

    ### Synchronized与ThreadLocal #### 一、Synchronized机制详解 **Synchronized** 是 Java 中一个非常重要的关键字,主要用于实现线程同步。它通过在对象上加锁来确保多个线程能够安全地访问共享资源。 - **作用...

    Synchronized关键字的用法

    synchronized (this) { count++; } } // 使用自定义锁 private final Object lock = new Object(); public void incrementWithCustomLock() { synchronized (lock) { count++; } } } ``` #### 性能...

    synchronized 的理解

    这意味着在任意时刻,都只有一个线程可以访问该实例的所有`synchronized`方法,或者进入由`synchronized(this)`标记的代码块。对于静态方法,锁对象则是该类的Class对象。 ```java public class MyClass { private...

    synchronized详解

    在方法级别,锁是`this`或`static`方法所属的Class对象;在同步块中,锁是块内指定的对象。同时,应该谨慎使用`synchronized`,因为它会引入性能开销,并可能导致死锁。避免不必要的同步控制,只在绝对必要的地方...

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

    synchronized() 中是锁住的对象,synchronized(this) 锁住的只是对象本身,同一个类的不同对象调用这个方法并不会被锁住,而 synchronized(className.class) 实现了全局锁的功能,全部这个类的对象调用这个方法都受...

    java synchronized demo

    同步方法会隐式地使用`this`作为监视器对象,或者对于静态方法,监视器对象是对应的类的Class实例。 3. **监视器对象**: - 监视器对象是用于锁定的目标,可以是任何对象。在同步代码块中,可以自定义对象作为...

    深入理解java中的synchronized关键字

    - 如果一个线程在一个对象的`synchronized(this)`块中,其他线程仍然可以访问该对象的非`synchronized(this)`代码块。 - 对象锁仅适用于该对象的`synchronized`代码块,不影响其他线程对其他对象的访问。 以下是...

    java的线程同步机制synchronized关键字的理解_.docx

    用法是:synchronized(this){/*区块*/},它的作用域是当前对象。 synchronized 的使用注意事项 1. synchronized 方法可能会对系统性能产生影响, nên尽量避免无谓的同步掌握。 2. 使用 synchronized 关键字时,...

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

    在提供的示例中,`MyRunable`类的`run()`方法使用`synchronized(this)`代码块,这里的`this`指的是`MyRunable`对象。由于`t1`和`t2`都基于同一个`Runnable`对象`demo`创建,所以它们共享`demo`的锁。当一个线程执行`...

    Javasynchronized机制.pdf

    synchronized (this) { // ... } } } ``` 在这里,`this`代表调用方法的对象,即锁是对象实例本身。 2. **同步块(同步代码块)**: 同步块允许我们指定一个具体的对象作为锁。这可以更细粒度地控制同步,...

Global site tag (gtag.js) - Google Analytics