`

请您先登录,才能继续操作

理解synchronized(Object)锁

阅读更多

package test;

public class Test2 {
static class Inner1 {
public void m1() {
synchronized("aaaa") {
for (char c = 'a'; c <= 'g'; c++) {
System.out.println(Thread.currentThread().getName() + " m1() : " + c);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}
public synchronized void m2() {
for (char c = 'a'; c <= 'g'; c++) {
System.out.println(Thread.currentThread().getName() + " m2() : " + c);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}
public static void main(String[] args) {
final Inner1 in1 = new Inner1();
Thread t1 = new Thread(
new Runnable() {
public void run() {
in1.m1();
}
}, "T1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
in1.m2();
}
}, "T2"
);
t1.start();
t2.start();
}
}

结果:

T1 m1() : a
T2 m2() : a
T1 m1() : b
T2 m2() : b
T1 m1() : c
T2 m2() : c
T1 m1() : d
T2 m2() : d
T1 m1() : e
T2 m2() : e
T1 m1() : f
T2 m2() : f
T1 m1() : g
T2 m2() : g

分析:

m2()是Inner1类中的一个同步方法,而m1()中包含了一个同步块。

m1()中的同步块只是针对对象"aaaa"进行同步,它不能对Inner1实例本身进行同步。所以,如上例所示,两个线程互不干扰,同时运行。

再看下面这个例子:

package test;

public class Test1 {
static class Inner1 {
public void m1(Inner2 i2) {
String str = Thread.currentThread().getName();
synchronized (i2) {
System.out.println(str + " enter: Inner1.m1()");
for (char c = 'a'; c <= 'g'; c++) {
System.out.println(str + "goto: " + c);
try {
Thread.sleep(100);
} catch (InterruptedException e) {

}
}
System.out.println(str + " leave: Inner1.m1()");
}
}
public synchronized void m2() {
String str = Thread.currentThread().getName();
System.out.println(str + " enter: Inner1.m2()");
for (char c = 'a'; c <= 'z'; c++) {
System.out.println(str + "goto: " + c);
try {
Thread.sleep(100);
} catch (InterruptedException e) {

}
}
System.out.println(str + " leave: Inner1.m2()");
}
}
static class Inner2 {
public synchronized void m1() {
String str = Thread.currentThread().getName();
System.out.println(str + " enter: Inner2.m1()");
for (char c = 'a'; c <= 'g'; c++) {
System.out.println(str + "goto: " + c);
try {
Thread.sleep(100);
} catch (InterruptedException e) {

}
}
System.out.println(str + " leave: Inner2.m1()");
}
}
public static void main(String[] args) {
final Inner1 in1 = new Inner1();
final Inner2 in2 = new Inner2();
Thread t1 = new Thread(
new Runnable() {
public void run() {
in1.m1(in2);
}
}, "T1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
in1.m2();
}
}, "T2"
);
Thread t3 = new Thread(
new Runnable() {
public void run() {
in2.m1();
}
}, "T3"
);
t1.start();
t2.start();
t3.start();
}
}

结果:

T1 enter: Inner1.m1()
T1goto: a
T2 enter: Inner1.m2()
T2goto: a
T1goto: b
T2goto: b
T1goto: c
T2goto: c
T1goto: d
T2goto: d
T1goto: e
T2goto: e
T2goto: f
T1goto: f
T2goto: g
T1goto: g
T2goto: h
T1 leave: Inner1.m1()
T3 enter: Inner2.m1()
T3goto: a
T2goto: i
T3goto: b
T3goto: c
T2goto: j
T3goto: d
T2goto: k
T3goto: e
T2goto: l
T3goto: f
T2goto: m
T3goto: g
T2goto: n
T3 leave: Inner2.m1()
T2goto: o
T2goto: p
T2goto: q
T2goto: r
T2goto: s
T2goto: t
T2goto: u
T2goto: v
T2goto: w
T2goto: x
T2goto: y
T2goto: z
T2 leave: Inner1.m2()

分析:

T2的执行贯穿整个过程。T3在T1结束对Inner1.m1()的调用后才调用Inner2.m1(),这是因为Inner1.m1()方法中的同步块锁住了Inner2的对象in2。

分享到:
评论

相关推荐

    java 多线程synchronized互斥锁demo

    在Java编程语言中,多线程是并发执行多个任务或操作的一种方式,这对于优化系统性能、提高资源利用率具有重要意义。...对于开发者来说,理解和熟练掌握`synchronized`是编写高效、安全的多线程Java程序的基础。

    synchronized 的理解

    当`synchronized`用于修饰实例方法时,其锁对象是当前对象的实例。这意味着在任意时刻,都只有一个线程可以访问该实例的所有`synchronized`方法,或者进入由`synchronized(this)`标记的代码块。对于静态方法,锁对象...

    synchronized锁原理分析(一、从Java对象头看synchronized锁的状态)

    首先,我们需要理解synchronized锁住的是对象,而不是代码块。例如,当我们使用`synchronized (o)`对一个对象o进行加锁时,实际上是对o这个对象本身进行锁定,而不是对包围的代码块。这个过程通过修改对象的内部状态...

    Java synchronized使用案例

    总的来说,理解并合理使用`synchronized`对于编写高效、安全的多线程Java程序至关重要。在实际开发中,应根据具体需求选择合适的同步机制,避免过度使用导致性能下降。同时,配合其他并发工具类,可以实现更灵活、...

    synchronized用法大全实例

    在Java多线程编程中,`synchronized`关键字是一个至关重要的工具,用于实现线程间的同步,以确保共享资源的安全访问。本实例大全将全面解析`...理解并熟练使用`synchronized`,是编写健壮的多线程Java程序的基础。

    Android synchronized 测试案例

    当一个线程进入`synchronized`代码块或方法时,其他试图进入同一块的线程将被阻塞,直到持有锁的线程退出。 二、同步单个对象 1. 同步方法:在方法声明前加上`synchronized`关键字,使得每次只有一个线程能执行该...

    Java synchronized详细解读.docx

    然而,正确使用`synchronized`需要对并发编程有深入理解,以确保性能和正确性之间的平衡。在编写多线程程序时,开发者应该根据具体情况选择合适的同步策略,避免不必要的同步控制,以优化程序的性能。

    java同步synchronized关键字用法示例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块...理解和熟练运用`synchronized`对于编写健壮的并发程序至关重要。

    synchronized并发讲解源码.zip

    除了锁住对象或类,`synchronized`还可以与`wait()`、`notify()`和`notifyAll()`方法结合使用,实现复杂的线程通信和同步。这些方法都是在`Object`类中定义的,只有在持有对象锁的情况下才能调用,否则会抛出`...

    synchronized锁原理分析(二、锁的膨胀过程)

    此时,Mark Word会存储指向Monitor Object的指针,表明当前对象被重量级锁保护。 了解锁膨胀的过程有助于我们更好地理解和优化多线程代码。例如,可以通过JVM参数调整来控制偏向锁的行为,如`-XX:...

    JAVA synchronized详解

    为了更好地理解`synchronized`的工作原理,我们来看两个示例。 ##### 示例1:同步方法 下面的代码展示了一个使用同步方法的例子,其中定义了一个`Thread1`类,实现了`Runnable`接口。在这个类中,`run()`方法被`...

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

    Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...

    java synchronized demo

    在Java编程语言中,`...总结,`java synchronized demo`是一个关于如何在Java中使用`synchronized`关键字进行线程同步的示例,通过理解和实践这个例子,开发者可以更好地掌握多线程环境下数据安全和同步的重要性。

    详细解读java同步之synchronized解析

    【Java同步之synchronized解析】 Java中的`synchronized`关键字是实现多线程同步的重要机制,它确保了在并发环境中对共享资源的...理解并熟练掌握`synchronized`的使用对于编写高性能、线程安全的Java程序至关重要。

    Synchronized 终极说明教程

    总结,理解并熟练运用`synchronized`是Java多线程编程的基础,通过它,我们可以构建出稳定、高效的并发程序。在实际应用中,应根据具体场景选择合适的方法,结合其他并发工具,如`Lock`,以达到最佳的性能和安全性。

    java关键字Synchronized详解

    - 对象头(Object Header)包含了Mark Word,用于存储锁状态信息。在32位系统中,Mark Word通常为32位,其中包括锁标志位和其他元数据。 6. **锁的开销** - 锁的获取和释放涉及操作系统层面的互斥原语,可能导致...

    java-synchronized详解.doc

    3. 对象锁与类锁的区别:如果同步代码块是基于类的静态方法(`static synchronized`),则锁是针对类的,所有实例共享这个锁。而基于实例方法的同步锁是针对实例对象的。 4. 可重入性:一个线程已经拥有某个对象的...

    ReentrantLock 与 synchronized 简介

    例如:`synchronized (lockObject) { // code }`。 2. **重要特性**: - **原子性**:保证了同步区域内的操作要么全部完成,要么一个都不做,防止了多个线程同时更新共享状态导致的数据不一致。 - **可见性**:...

    第16讲 synchronized底层如何实现?什么是锁的升级、降级?1

    当发生锁竞争时,如果 CAS 操作失败,锁就会膨胀为重量级锁,Mark Word 会存储指向重量级锁(Monitor Object)的指针。 Java 的并发包 `java.util.concurrent.locks` 提供了其他类型的锁,如 `ReentrantLock`,它...

Global site tag (gtag.js) - Google Analytics