`
taya
  • 浏览: 8734 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

ObjectLock & ClassLock

阅读更多
对象锁
当一个对象中有synchronized method或synchronized block的时候
调用此对象的同步方法或进入其同步区域时,就必须先获得对象锁
如果此对象的对象锁已被其他调用者占用,则需要等待此锁被释放

同步静态方法/静态变量互斥体
由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只由一份
所以,一旦一个静态的方法被申明为synchronized
此类所有的实例化对象在调用此方法,共用同一把锁,我们称之为类锁
一旦一个静态变量被作为synchronized block的mutex
进入此同步区域时,都要先获得此静态变量的对象锁

类锁
由上述同步静态方法引申出一个概念,那就是类锁
其实系统中并不存在什么类锁
当一个同步静态方法被调用时,系统获取的其实就是代表该类的类对象的对象锁

在程序中获取类锁
可以尝试用以下方式获取类锁
synchronized (xxx.class) {...}
synchronized (Class.forName("xxx")) {...}

同时获取2类锁
同时获取类锁和对象锁是允许的,并不会产生任何问题
但使用类锁时一定要注意,一旦产生类锁的嵌套获取的话,就会产生死锁
因为每个class在内存中都只能生成一个Class实例对象
分享到:
评论

相关推荐

    c#lock 演示代码

    private static object _lockObject = new object(); public void SafeIncrement() { lock (_lockObject) { count++; } } ``` 这样的改进确保了所有的`SafeIncrement`调用都会使用同一个锁,无论在哪个线程...

    c#线程 lock用法

    `lock`关键字后面跟的是一个对象引用,通常是一个私有的静态对象,如示例中的`private static object privateObjectLock = new object();`。这个对象称为互斥量(mutex),它起到了锁的作用。当一个线程进入`lock`...

    解决ArcSDE版本lock问题

    然而,在实际操作过程中,用户可能会遇到“lockrequestconflictswithanestablishedlock”这样的错误提示,这通常意味着某个数据集或版本已被锁定,无法进行进一步的操作,如编辑、创建 featureclass 或注册新版本等...

    Java多线程 生产者消费者模型实例详解

    Object lock = new Object(); final Producer producer = new Producer(lock); final Customer customer = new Customer(lock); Runnable producerRunnable = new Runnable() { public void run() { while ...

    Java_Reader_Writer.rar_java reader writ_读者写者

    private final Object lock = new Object(); public void read() { synchronized (lock) { readerCount++; if (readerCount == 1) { // 如果是第一个读者,需要等待写者 while (isWriterActive()) { lock....

    Java Thread用法 经典

    private final Object lock = new Object(); @Override public void run() { String threadName = Thread.currentThread().getName(); if ("A".equals(threadName)) { synchronized (lock) { System.out....

    非常经典的死锁演示代码

    final Object lock1 = new Object(); final Object lock2 = new Object(); // 创建线程1 Runnable run1 = new Runnable() { public void run() { synchronized (lock1) { // 获取lock1锁 print("lock1"); ...

    Java线程不安全分析,同步锁和Lock机制,哪个解决方案更好 (2).docx

    private final Object lock = new Object(); private int num = 50; @Override public void run() { for (int i = 0; i ; i++) { synchronized (lock) { if (num > 0) { try { Thread.sleep(10); } catch...

    微软内部资料-SQL性能优化3

     Discuss how lock manager uses lock mode, lock resources, and lock compatibility to achieve transaction isolation.  Describe the various transaction types and how transactions differ from batches....

    记录redisson实现redis分布式事务锁

    public Object lock(ProceedingJoinPoint joinPoint, DistributedLock distributedLock) throws Throwable { RLock lock = redissonClient.getLock(distributedLock.key()); try { if (distributedLock.waitTime...

    C#中lock用法详解

    同样,锁定公共类型(如`lock(typeof(Class))`)可能会导致广泛的影响,范围过大。 3. **不推荐锁定`this`**:锁定`this`会锁定当前实例,但这可能导致其他线程通过不同实例访问同一代码,从而失去同步效果。此外,...

    java Object wait方法详细介绍

    private final Object lock = new Object(); private boolean condition; public void doSomething() { synchronized (lock) { while (!condition) { try { // 当条件不满足时,线程A调用wait,释放锁并等待...

    并发编程面试专题.pdf

    private final Object lock2 = new Object(); public void mayDeadlock() { new Thread(() -> { synchronized (lock1) { System.out.println("Thread 1: Holding lock 1..."); try { Thread.sleep(100); } ...

    多线程的同步问题(1)

    private static Object lock = new Object(); public MyThread(int id) { this.threadId = id; } @Override public void run() { synchronized (lock) { for (int i = 0; i ; ++i) { System.out.println...

    Synchronized关键字的用法

    private final Object lock = new Object(); public void updateStatus() { synchronized (lock) { // 更新状态变量 } } ``` 4. **同步局部变量**:如果需要同步的资源是局部变量,则可以使用`...

    C#锁(lock)的练习-模拟多客户端购票example

    lock (object) { // 临界区代码 } ``` 这里的`object`是一个引用类型,通常是一个私有静态对象,这样可以确保不同实例之间的锁不会相互影响。在临界区内,只有获得锁的线程才能执行代码,其他线程会被阻塞,直到...

    org.eclipse.swt.win32

    org.eclipse.swt.internal.Lock.class org.eclipse.swt.internal.Platform.class org.eclipse.swt.internal.SWTEventListener.class org.eclipse.swt.internal.SWTEventObject.class org.eclipse.swt.internal....

    c#多线程中Lock()关键字的用法小结

    private readonly object _lockObject = new object(); public Account(int initialBalance) { balance = initialBalance; } public int Withdraw(int amount) { if (balance ) { throw new Exception(...

    深入C#并发编程:掌握锁和同步的艺术

    private static object lockObject = new object(); static void Main() { for (int i = 0; i ; i++) { Thread thread = new Thread(AccessResource); thread.Start(); } } static void AccessResource...

Global site tag (gtag.js) - Google Analytics