Java-------对Synchronized锁的理解

Java对于多线程是有自己的处理方式的,但是锁的机制来来回回看了好几遍 每次都有新的理解、甚至不同。
今天又看了几篇博主的文章,也不知道理解的对不对,决定把自己的见解记录下来。过后有新的见解会再加上或更改
Java 为了实现多线程同步,有锁机制,大致有Lock 和 synchronized两种方法
这篇为了记录对synchronized锁对象的理解,过后会写Lock
1 、 synchronized的用法:
大概就是sybchronized 后面加个(锁对象){} 大括号里面的代码就被“锁住了” ,或者是直接修饰方法|静态方法
2、 锁对象
顾名思义,是个对象,但是一定是相同的对象才会触发锁机制,两个不同地址值的对象被synchronized括起来是不会触发锁机制的比如:
小 1、

public Demo1 {
    public test () {
       String str = new String("abc");    //不同的对象会创建不同==地址==的str   这里不讨论string的创建方法放进常量池的问题
        synchronized (str) {
             //do something
         }
    }
}

(ps:我就不写线程代码去执行了,感觉还不如文字来的舒服)
这时候如果创建了两个Demo1对象 d1 、d2 那么d1 和 d2 之间是不会相互影响的。如果是两个线程t1、t2都调用d1的test()方法 那么 就是收到synchronized的约束。一定会按照顺序执行。
如果直接用sybchronized 修饰方法是一样的结果 几乎等效于 synchronized(this)
问题来了 如果我想 多个线程处理不同的对象 还想让方法之间同步 应该怎么做,那就创建一个相同的对象
还是上面的代码

public Demo1 {
   ==private static Strings str  = new String("abc");==
    public test () {
        synchronized (str) {
             //do something
         }
    }
}

这时候静态变量是不变的所以 即使是两个线程调用两个对象 也是一个地址的锁对象 是会受到锁机制影响的

利用这个机制呢 我们可以处理两个方法的相互制约,也就是两个方法用相同的锁对象 就可以达到同一时间只能执行一个方法
的问题

public Demo1 {
   ==private static Strings str  = new String("abc");==
    public test () {
        synchronized (str) {
             //do something
         }
    }
    public test2() {
        synchronized (str) {
             //do something
         }
    }
}

test 和 test2 方法是相互制约的
sybchronized 大概方法记录到此,虽然对多线程处理有好处,但是也不要乱用 因为同步毕竟会影响性能,能用其他方式处理的就不要用synchronized

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值