JavaRush /Java 博客 /Random-ZH /线程同步、对象锁定和类锁定
CynepHy6
第 34 级
Великий Новгород

线程同步、对象锁定和类锁定

已在 Random-ZH 群组中发布
线程同步、对象锁定和类锁定 - 1同步是指多线程。同步代码块一次只能由一个线程执行。 Java支持多线程执行。这可能会导致两个或多个线程访问同一字段或对象。同步是一个允许程序中所有并行线程同步运行的过程。同步可以避免由于对共享内存的访问不一致而导致的内存一致性错误。当一个方法被声明为同步时,线程会持有一个正在执行其方法的对象的监视器。如果另一个线程正在执行同步方法,您的线程将阻塞,直到另一个线程释放监视器。Java 中的同步是通过保留字来实现的synchronized您可以通过定义同步方法或块在类中使用它。您将无法synchronized在类定义中使用变量或属性。

对象级锁定

这是一种同步非静态方法或非静态代码块的机制,以便只有一个线程可以在给定的类实例上执行给定的块或方法。每当您需要确保实例级数据线程安全时都应该执行此操作。例子:
public class DemoClass{
    public synchronized void demoMethod(){}
}
或者
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
或者
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

类级锁定

防止多个线程在该类的任何可用实例中执行期间进入同步块。这意味着,如果程序执行期间有 100 个该类的实例DemoClass,那么此时只有一个线程能够demoMethod()在任何一种情况下执行,而所有其他情况都将被其他线程阻塞。当您需要使静态数据线程安全时,这是必要的。
public class DemoClass{
    public synchronized static void demoMethod(){}
}
或者
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
或者
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

一些重要的注意事项

  1. Java 中的同步确保没有两个线程可以同时或并行执行同步方法。

  2. synchronized只能与方法和代码块一起使用。这些方法或块可以是静态的或非静态的。

  3. 每当任何线程进入同步方法或块时,它都会获取锁,每当线程退出同步方法或块时,JVM 都会释放锁。即使线程在完成后由于任何错误或异常而离开同步方法,锁也会被释放。

  4. synchronized在Java中这意味着如果一个同步方法调用另一个需要相同锁的同步方法,当前持有该锁的线程可以进入该方法而无需获取锁。

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION