首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java中的线程:如何锁定对象?

在Java中,锁定对象是一种同步机制,可以确保在同一时间只有一个线程访问或修改对象。要在Java中锁定对象,可以使用synchronized关键字。

以下是一个简单的示例,演示如何在Java中锁定对象:

代码语言:java
复制
public class SynchronizedExample {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        Thread thread1 = new Thread(myThread);
        Thread thread2 = new Thread(myThread);

        thread1.start();
        thread2.start();
    }
}

class MyThread implements Runnable {
    private Object lock = new Object();

    @Override
    public void run() {
        synchronized (lock) {
            System.out.println(Thread.currentThread().getName() + "获得了锁");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "释放了锁");
        }
    }
}

在这个示例中,我们创建了一个名为MyThread的类,它实现了Runnable接口。在run()方法中,我们使用synchronized关键字锁定了一个名为lock的对象。当一个线程获得锁时,它将执行synchronized块中的代码,并在释放锁之前阻止其他线程访问该对象。

SynchronizedExample类中,我们创建了两个线程,并启动它们。每个线程都将运行MyThread类的run()方法,尝试获取锁并输出相应的消息。由于我们使用了synchronized关键字,因此在任何时候只有一个线程可以访问lock对象,从而确保了线程安全。

总之,在Java中锁定对象是一种确保线程安全的重要机制。使用synchronized关键字可以帮助您实现对象锁定,从而避免多个线程同时访问和修改共享资源,导致数据不一致和其他问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 线程和锁

    虽然前面章节的大部分讨论只涉及一次执行单个语句或表达式时的代码行为,也就是说,通过单个线程,Java虚拟机可以同时支持多个线程执行。这些线程独立地执行对共享主内存中的值和对象进行操作的代码。线程可以通过拥有多个硬件处理器、对单个硬件处理器进行时间切片或对多个硬件处理器进行时间切片来支持。 线程由类表示。用户创建线程的唯一方法是创建该类的对象;每个线程都与这样一个对象相关联。当在相应的线程对象上调用start()方法时,线程将启动。 线程的行为,特别是在没有正确同步的情况下,可能会令人困惑和违反直觉。本章描述了多线程程序的语义;它包括一些规则,这些规则的值可以被多个线程更新的共享内存的读取所看到。由于该规范类似于针对不同硬件架构的内存模型,因此这些语义称为Java编程语言内存模型。当不会产生混淆时,我们将简单地将这些规则称为“内存模型”。 这些语义并没有规定多线程程序应该如何执行。相反,它们描述了多线程程序允许展示的行为。任何只生成允许行为的执行策略都是可接受的执行策略。

    02

    Synchronized的实现原理

    Synchronized是由JVM实现的一种实现互斥同步的一种方式,如果你查看被Synchronized修饰过的程序块编译后的字节码,会发现,被Synchronized修饰过的程序块,在编译前后被编译器生成了monitorenter、monitorexit两个字节码指令。 这两个指令是什么意思呢?    在虚拟机执行到monitorenter指令时,首先要尝试获取对象的锁:如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁的计数器+1;当执行monitorexit指令时将锁计数器-1;当计数器为0时,锁就被释放了。如果获取对象失败了,那当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止。Java中Synchronize通过在对象头设置标记,达到了获取锁和释放锁的目的。

    05
    领券