java中,用synchronized会锁定当前对象,这个对象指的是它包涵的代码块,还是一个类实例

java中,用synchronized会锁定当前对象,这个对象指的是它包涵的代码块,还是一个类实例化出来的对象?... java中,用synchronized会锁定当前对象,这个对象指的是它包涵的代码块,还是一个类实例化出来的对象? 展开
 我来答
ala400
推荐于2017-11-21 · TA获得超过1229个赞
知道小有建树答主
回答量:262
采纳率:100%
帮助的人:279万
展开全部

synchronized块   锁定的是制定对象,,,,,代码块只是锁定期间执行的操作

 

synchronized 修饰非静态方法    锁定的是该类的实例  同一实例在多线程中调用才会触发同步锁定  所以  多个被synchronized修饰的非静态方法在同一实例下  只能多线程同时调用一个

synchronized 修饰静态方法 锁定的是类本身,而不是实例,  同一个类中的所有被synchronized修饰的静态方法, 只能多线程同时调用一个

synchronized块    直接锁定指定的对象,,,,该对象在多个地方的同步锁定块,,,只能多线程同时执行其中一个

其他未获得锁的线程需要等待获得锁的线程执行完成并释放锁,

如果同时有多个线程等待锁释放,,那么锁释放后,等待的线程谁会获得锁,,这个不同JVM可能有差异

public class Run
{
    Object lock;
  
    public synchronized void runA()
    { 
    }

    public synchronized void runB()
    { 
    }

    public void runC()
    { 
        synchronized (this)
        {
              
        }  
    }
    
    public void runD()
    { 
        synchronized (lock)
        {
             
        }   
    }    
       


举例: 以上runA,runB,runC三个方法在同一实例多线程中互斥,他们都锁定的是this,当前类且调用当前方法的实例
而runD方法不和上面三个互斥,因为锁定的不是this,而是lock
追问

照你的意思,在下面的代码中,是不是就算有多个线程存在,但是当一个线程调用Text中的某一个方法时,其他线程就不能调用Text的另外的方法?

追答
非静态方法,,前提是同一实例,,
你上面的例子主线程和子线程都调用text实例的同步方法,,,,是会产生同步锁定的

没拿到锁定的线程不是不能调用其他同步方法,,,,而是执行同步方法的时候会等待其他线程释放锁定之后才能继续往下执行
举个例子,,,,有一间卫生间,,,,每个人都是一个线程,,,,每次只能有一个人在卫生间,,,,其他人必须等待里面的人出来之后,才能进去,,,....而如果有另外的一间卫生间,,,,,,那么两个卫生间的使用是不冲突的
每个卫生间好比一个类的实例对象,,,,,不同对象之间不冲突,,,

至于类每个不同同步方法就如你进入卫生间可能只是刷牙,,,可能只是洗澡,,,,但是都要占用卫生间
soysource
2015-09-15 · TA获得超过400个赞
知道小有建树答主
回答量:370
采纳率:0%
帮助的人:295万
展开全部
非static的,锁定实例,static的直接锁定类
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
邱君x
2015-09-14 · TA获得超过693个赞
知道小有建树答主
回答量:1662
采纳率:0%
帮助的人:522万
展开全部
度君正解
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式