【Java】Sychronized的作用范围和注意事项

一共分为三个范围:

  • 作用某对象上,例如
synchronized (this)、synchronized (object)
  • 作用在某方法上,例如:
public void test()
  • 作用在类上,例如:
① public synchronized static void test()

② synchronized(SynchronizeDemo.class) {
              ...
   }

不过还要注意下几个问题:

1》【synchronized(this) 】表示锁住了当前对象,那么当前对象是否可以访问其他方法呢?

可以!当一个线程访问该【synchronized(this)】同步代码块时,其他线程可以访问其他方法

2》【synchronized(this)】锁住当前对象,自然使用同一个对象访问同一临界区会发生阻塞。

但是如果换一个对象访问临界区,或同一对象访问非当前临界区,都可以正常访问,不会发生线程阻塞。

3》【public synchronized static void test()】这种采用static修饰的静态方法主要是类锁,即锁住后会锁住全部对象,

对象之间互斥。当多个对象并发执行此方法时,需要排队。

4》synchronized不能继承,父类的synchronized方法被子类继承后,默认不是synchronized的,必须手动用synchronized修饰方法。

并且接口中的方法不可以用synchronized修饰

构造方法不能加synchronized关键字,加了编译器也会报错,并且new对象的过程采用了CAS等方式保证了并发安全性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: synchronized和reentrantlock都是Java中用于实现线程同步的机制。 synchronized是Java中最基本的同步机制,它可以用于方法或代码块级别的同步。当一个线程进入synchronized代码块时,它会尝试获取锁,如果锁已经被其他线程持有,则该线程会被阻塞,直到锁被释放。synchronized机制是Java中最常用的同步机制之一,但它有一些限制,例如无法中断正在等待锁的线程,也无法尝试获取锁而不阻塞。 reentrantlock是Java中另一种同步机制,它提供了更多的灵活性和控制。与synchronized不同,reentrantlock可以中断正在等待锁的线程,也可以尝试获取锁而不阻塞。此外,reentrantlock还提供了一些高级功能,例如公平锁和可重入锁。但是,reentrantlock的使用比synchronized更复杂,需要手动获取和释放锁,并且需要注意避免死锁等问题。 总的来说,synchronized是Java中最基本的同步机制,适用于大多数情况。而reentrantlock则提供了更多的灵活性和控制,适用于一些特殊的场景。 ### 回答2: synchronized和ReentrantLock是Java中用于实现线程同步的两种机制。 synchronized是Java中最基本的线程同步机制,它使用了内置的监视器锁(也称为对象锁或互斥锁)来控制线程的访问。synchronized关键字可以用于方法或代码块,并且是隐式锁。当线程执行到synchronized关键字时,会自动获取锁,执行完后会自动释放锁。synchronized关键字确保了在同一时间只有一个线程可以访问被锁定的代码或方法,从而保证了线程的安全性。然而,synchronized关键字也有一些缺点,比如无法获得锁时会一直阻塞等待和释放锁。 ReentrantLock是Java中的另一种线程同步机制,它是通过显示锁来实现的。ReentrantLock提供了更灵活的锁定操作,相比于synchronized,它具有更多的特性。ReentrantLock可以使用lock()和unlock()方法来手动加锁和解锁,这意味着我们可以更加精确地控制代码的同步性。ReentrantLock还支持可重入性,即线程可以多次获得同一个锁,提供了更高的灵活性。它还支持公平锁和非公平锁两种模式,可以按照先进先出的规则来选择获取锁的线程。此外,ReentrantLock还提供了一些高级功能,比如可中断锁、超时锁和条件变量等。 总的来说,synchronized是Java中最基本的线程同步机制,使用简单但灵活性较低。而ReentrantLock则提供了更多的功能和灵活性,但使用相对复杂一些。在实际应用中,我们可以根据具体需求来选择使用哪种线程同步机制。 ### 回答3: synchronized和ReentrantLock都是Java中用于实现线程同步的工具。 synchronized是Java中最常见的同步关键字,它可以应用在方法或代码块上。当一个线程获取到对象的synchronized锁时,其他线程就无法同时访问这个对象。当该线程执行完代码块或者方法,会释放锁,其他线程才能获得锁并执行。synchronized是隐式获取和释放锁的过程,非常方便,但也存在一些限制,例如无法中断一个正在等待获取锁的线程。 ReentrantLock是Java中提供的一种显示锁,可以实现与synchronized类似的功能。与synchronized不同的是,ReentrantLock提供了更灵活和更强大的功能。它允许更细粒度的控制锁定的获取和释放,例如通过lock()和unlock()方法手动获取和释放锁,也可以通过tryLock()方法尝试获取锁而不需要一直等待。此外,ReentrantLock还支持公平性,即按照线程请求的顺序获取锁,避免产生线程饥饿现象。而synchronized则不保证公平性。 另外,ReentrantLock提供了Condition接口,可以使用newCondition()方法创建多个条件变量。条件变量可以用于线程间的通信,可以让某个线程等待特定条件满足后再继续执行,或者通知其他等待线程某个条件已经满足。 总的来说,synchronized是Java中隐式锁机制的实现,使用方便但功能有限;而ReentrantLock是显示锁机制的实现,提供了更多灵活和强大的功能,但使用起来需要更细致的控制。根据具体情况需要,我们可以选择合适的同步机制来保证线程安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值