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

你可能感兴趣的:(基础知识)