synchronized锁的到底是什么?

1.起源于一个问题

场景一:线程安全吗?

static String lock1 = new String("aaa");
static String lock2 = new String("bbb");

public static void test3(){
        synchronized (lock1) {
            // 业务代码会被锁住吗?
            lock1 = lock1 + "x";
            i++;
        }
}



public static void main(String[] args) throws Exception{
        for(int i=0;i<10000;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    test3();
                }
            }).start();
        }
        System.out.println("结果是:" + i);

}

结果是 i=10000

 

 

场景二:线程安全吗?

public static void test(){
        synchronized (lock1) {
            // 业务代码
            j++;
        }
}




public static void main(String[] args) throws Exception{
       
        System.out.println("-----------一秒后替换-------------");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                lock1 = lock2;
            }
        }).start();


        for(int j=0;j<10000;j++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    test();
                }
            }).start();
        }
        System.out.println("结果j是:" + j);

    }

结果是:j=10000

 

 

 

2.ReentrantLock对比

// CAS修改的字段
protected final void setState(int newState) {
        state = newState;
}



//使用
public static void test4(){
        ReentrantLock lock = new ReentrantLock();
        // 锁----ReentrantLock中的state
        lock.lock();
        //业务逻辑
        lock.unlock();
    }

 

 

 

3.Sync到底锁的是啥

对象的结构:

1.属性:Java对象的实例数据(不固定)

2.对象头(固定)----12byte----96bit

3.数据对齐



对象头由:Mark word(64bit)、Klass pointer(32bit-开启指针压缩)组成

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值