`
小网客
  • 浏览: 1243678 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

synchronized之类锁和实例锁

    博客分类:
  • Java
 
阅读更多

synchronized可以修饰代码块和方法,方法又分为静态方法和普通方法,那么一言概之:线程执行的时候当有synchronized时,他获取的是类锁或实例锁然后才能执行。

代码准备:

构造四类同步方法:

public synchronized void a() {
	System.out.println("a");
	try {
		Thread.sleep(10000l);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}

}
public synchronized void b() {
	System.out.println("b");
}

public static synchronized void c() {
	System.out.println("static c");
	try {
		Thread.sleep(10000l);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

public static synchronized void d() {
	System.out.println("static d");
}

通过sleep来实现操作差

 

案例1:如果某一对象有多个同步方法,那么其只能排队访问其对应的同步方法,因为此时是对象锁

public static void testInstance1() {
	final ThreadTest t1 = new ThreadTest();
	new Thread(new Runnable() {
		@Override
		public void run() {
			t1.a();
		}
	}, "T1").start();

	new Thread(new Runnable() {
		@Override
		public void run() {
			t1.b();

		}
	}, "T2").start();
}

输出:

a

然后开始等待,方法a执行完之后输出b

 

案例2:多个实例,访问各自不同的同步方法时不受影响:

public static void testInstance2() {
	final ThreadTest t1 = new ThreadTest();
	final ThreadTest t2 = new ThreadTest();
	new Thread(new Runnable() {
		@Override
		public void run() {
			t1.a();
		}
	}, "T1").start();

	new Thread(new Runnable() {
		@Override
		public void run() {
			t2.b();

		}
	}, "T2").start();
}

输出:

a

b

方法a未执行结束

 

案例3:当同步访问静态方法和非静态方法时不受影响,因为他们是两个不同的锁,静态方法是类锁而非静态方法为实例锁:

public static void testInstance3() {
	final ThreadTest t1 = new ThreadTest();
	new Thread(new Runnable() {
		@Override
		public void run() {
			t1.a();
		}
	}, "T1").start();

	new Thread(new Runnable() {
		@Override
		public void run() {
			ThreadTest.c();

		}
	}, "T2").start();
}

输出:

a

static c

而a方法未执行结束,实例锁未释放

 

案例4:当并发访问两个非静态方法是需要同步等待:

public static void testInstance4() {
	new Thread(new Runnable() {
		@Override
		public void run() {
			ThreadTest.c();

		}
	}, "T2").start();
	new Thread(new Runnable() {
		@Override
		public void run() {
			ThreadTest.d();
		}
	}, "T1").start();

}

输出:

static c

等c执行完成之后释放了类锁之后输出static d

 

结论:

1.静态方法锁的是类,而非静态方法锁的是当前的实例,两把不同的锁互不影响;
2.类锁只有一把,而不同的实例其锁不同;
3.静态代码块效果等同;

 

 

 

0
2
分享到:
评论

相关推荐

    Java 同步锁(synchronized)详解及实例

    Java中的同步锁,即`synchronized`关键字,是Java多线程编程中用于解决并发问题的重要机制。它确保了对共享资源的互斥访问,防止数据的不一致性。当我们有多线程环境并涉及到共享数据时,可能会出现竞态条件,就像...

    Synchronized关键字的用法

    初始状态下使用偏向锁,当多个线程竞争时升级到轻量级锁,进一步升级为重量级锁。 #### 示例代码 ```java public class SyncExample { private int count = 0; // 同步实例方法 public synchronized void ...

    Java synchronized使用案例

    4. **锁膨胀**:如果同步代码块的性能瓶颈导致CPU开销过大,JVM会将轻量级锁升级为重量级锁(监视器锁),这可能导致性能下降。 四、`synchronized`与其他并发工具类的对比 1. **ReentrantLock**:具有`...

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

    当对象被synchronized锁定时,MarkWord会记录锁的相关信息,如轻量级锁或重量级锁的状态。 2. Klass Pointer:这部分存储的是对象所属类的元数据的指针,即对象的类类型。通过这个指针,虚拟机能够识别对象属于哪个...

    ReentrantLock与synchronized

    在Java多线程编程中,`ReentrantLock`和`synchronized`都是用于实现线程同步的重要工具,确保在并发环境中数据的一致性和正确性。两者虽然都能实现互斥访问,但在功能、性能以及使用场景上有所不同。下面我们将深入...

    详细解读java同步之synchronized解析

    - **轻量级锁**:当锁对象首次被线程请求时,不会立即升级为重量级锁,而是先尝试使用轻量级锁。只有当多个线程竞争时,才会升级。 ### 6. synchronized的五种使用方式 - **同步方法**:在方法声明前加上`...

    java关键字Synchronized详解

    为了避免这种情况,Java通过锁升级机制(从偏向锁到轻量级锁再到重量级锁)来应对不同的竞争程度,以平衡并发性能和系统资源消耗。 5. **Monitor对象内存布局** - 对象头(Object Header)包含了Mark Word,用于...

    Java 多线程与并发(4-26)-关键字- synchronized详解.pdf

    例如,在 Java 6 中,synchronized 关键字的实现原理是偏斜锁,而在 Java 8 中,synchronized 关键字的实现原理是轻量级锁。 synchronized 关键字是 Java 多线程与并发中的重要工具,可以实现线程安全的数据共享和...

    synchronized并发讲解源码.zip

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

    [JAVA][synchronized的使用]

    - **synchronized代码块**:使用`{}`包围需要同步的代码,指定一个监视器(通常为对象实例或者类的Class对象),只有获得该监视器锁的线程才能执行这部分代码。 3. **同步机制与 Monitor** 在Java中,每个对象都...

    ReentrantLock 与 synchronized 简介

    锁的对象取决于方法的作用域:静态方法使用类对象作为锁,实例方法使用当前对象实例作为锁。 - **代码块同步**:使用`synchronized`关键字包围代码块,可以指定锁对象。例如:`synchronized (lockObject) { // code...

    Java synchronized 详解.docx

    - Java内存模型中,随着并发量的增加,锁的实现机制会进行优化,从偏向锁、轻量级锁到重量级锁的升级,以平衡性能和同步效果。 通过理解`synchronized`关键字的工作原理和应用场景,开发者可以在多线程编程中有效...

    深入理解Java并发之synchronized实现原理.docx

    - 轻量级锁:当锁不存在竞争时,使用CAS操作升级锁状态,避免了阻塞和操作系统级别的上下文切换。 - 自旋锁:如果锁很快就能释放,线程不会立即阻塞,而是会循环检查是否能获取锁,减少了不必要的阻塞时间。 - 锁...

    java synchronized demo

    - 从Java 5开始,JVM对`synchronized`进行了很多优化,如偏向锁、轻量级锁、自旋锁等,使得在低负载情况下,同步操作的性能得到了显著提升。 9. **示例代码分析**: 根据提供的文件名,`GenerateCode.java`可能...

    继续撩一撩Java synchronized1

    总之,Java的`synchronized`关键字是实现线程安全和数据一致性的重要工具,其背后涉及到对象头的Mark Word、Monitor、轻量级锁等概念,以及一系列优化策略,以适应多线程环境下的并发控制需求。理解和熟练掌握`...

    java-synchronized详解.doc

    2. 锁的概念:每个对象都有一个与之关联的锁,当线程执行`synchronized`代码时,会自动获取对象的锁,执行完成后释放锁。如果多个线程同时尝试进入同一对象的`synchronized`代码,只有一个线程能成功获取锁,其他...

    Java对象锁和类锁全面解析(多线程synchronize

    Java对象锁和类锁是Java多线程编程中至关重要的概念,它们是通过`synchronized`关键字来实现的,用于确保代码在并发环境下的线程安全。在这个全面解析中,我们将深入探讨这两个锁机制,理解它们的工作原理以及如何在...

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

    5. 性能开销:使用`synchronized`会带来一定的性能损耗,因为它涉及到了系统级的锁操作。 五、synchronized与volatile比较 `synchronized`提供了线程安全的读写,而`volatile`则保证了变量的可见性,但不保证原子...

    Synchronized与ThreadLocal

    - Synchronized 的性能开销较大,尤其是在高并发环境下,因为涉及锁的获取和释放。 - ThreadLocal 相对来说具有更好的性能,因为它避免了线程间的同步,减少了锁的开销。 #### 四、案例分析 假设有一个场景,...

    并发编程之synchronized&Lock&AQS详解(1)1

    `synchronized`的关键字在字节码中对应`monitorenter`和`monitorexit`指令,每个对象都有一个`Mark Word`存储锁状态,如无锁、偏向锁、轻量级锁和重量级锁等。 2. `Lock`:`Lock`接口及其实现类如`ReentrantLock`...

Global site tag (gtag.js) - Google Analytics