Synchronized代码详解?

简介: Synchronized代码详解?

synchronized是java的关键字,他有以下特性。

互斥性:同一个时间只允许一个线程获取到某个对象锁,这样就可以保证线程安全,同一时间只有一个线程可以对代码进行访问操作。互斥性也就是我们经常说的原子性。

可见性:必须保证在锁被释放前,对数据的修改 对其他线程是可见的,否则其他线程从其他地方获取数据导致不一致性。


synchronized是隐式锁,是jvm内置锁,不需要手动加锁与解锁,jvm会自动加锁跟解锁。

而lock则需要实现lock接口,需要手动加锁和解锁。


下面代码实例从三个方面进行加锁。

  1. 静态方法,锁的是类对象。
  2. 普通方法,锁的是实例对象。

(需要注意:在spring容器中,bean是单实例,否则加synchronized没什么意义)

  1. 代码块:锁的是括号里的对象。
/**
 * @author keying
 */
public class Synchronized822 {
    public static void main(String[] args) throws InterruptedException {
        ThreadTestNei threadTestNei = new ThreadTestNei();
        ThreadA threadA = new ThreadA(threadTestNei);
        threadA.setName("A-THREAD");
        threadA.start();
        ThreadB threadB = new ThreadB(threadTestNei);
        threadB.setName("B-THREAD");
        threadB.start();
    }
}
class ThreadA extends Thread {
    private ThreadTestNei threadTestNei;
    ThreadA(ThreadTestNei threadTestNei) {
        this.threadTestNei = threadTestNei;
    }
    @Override
    public void run() {
        super.run();
        threadTestNei.setUser();
    }
}
class ThreadB extends Thread {
    private ThreadTestNei threadTestNei;
    ThreadB(ThreadTestNei threadTestNei) {
        this.threadTestNei = threadTestNei;
    }
    @Override
    public void run() {
        super.run();
        threadTestNei.setUser();
    }
}
@Data
class ThreadTestNei {
    private String name;
    private String aString = new String();
    public void setUser() {
        try {
            synchronized (aString) {
                System.out.println(Thread.currentThread().getName() + "----" + "begin");
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + "----" + "end");
            }
        } catch (Exception e) {
        }
    }
}

这时候他们修饰的是同一个对象,所以 输出是

A-THREAD----begin
A-THREAD----end
B-THREAD----begin
B-THREAD----end

当代码改为

try {
            String aString = new String();
            synchronized (aString) {
                System.out.println(Thread.currentThread().getName() + "----" + "begin");
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + "----" + "end");
            }
        } catch (Exception e) {
        }

输出则是:

A-THREAD----begin
B-THREAD----begin
A-THREAD----end
B-THREAD----end

如果锁住的是类,则输出的是

try {
            synchronized (ThreadTestNei.class) {
                System.out.println(Thread.currentThread().getName() + "----" + "begin");
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + "----" + "end");
            }
        } catch (Exception e) {
        }
A-THREAD----begin
A-THREAD----end
B-THREAD----begin
B-THREAD----end
相关文章
|
3月前
|
算法 Java 编译器
Synchronized你又知道多少?
Synchronized 是 JVM 实现的一种互斥同步机制,通过 monitorenter 和 monitorexit 指令控制对象锁的获取与释放。锁的本质是对象头的标记,确保同一时间只有一个线程访问资源。Synchronized 支持可重入性,允许方法内部调用其他同步方法而不阻塞。JVM 对锁进行了优化,引入了自旋锁、偏向锁、轻量级锁和重量级锁,以减少系统开销。Synchronized 属于悲观锁,而乐观锁基于 CAS(Compare and Swap)算法实现非阻塞同步,提高并发性能。
73 6
|
7月前
|
Java
synchronized
synchronized
41 2
|
7月前
|
存储 安全 Java
|
Java
07.synchronized都问啥?
大家好,我是王有志。经过JMM和锁的铺垫,今天我们正式进入synchronized的内容,来看看关于synchronized面试中都会问啥?
68 1
07.synchronized都问啥?
Synchronized
作用:能够保证在同一时刻最多有一个线程执行该段代码,以保证并发的安全性。(当第一个线程去执行该段代码的时候就拿到锁,并独占这把锁,当方法执行结束或者一定条件后它才释放这把锁,在没释放锁之前,所有的线程处于等待状态)
75 0
synchronized的总结
synchronized的总结
synchronized的总结
|
前端开发 Java Spring
方法上加上 synchronized 就可以了么
方法上加上 synchronized 就可以了么
|
存储 缓存 安全
synchronized的简单理解
synchronized的简单理解
104 0
|
Java 编译器
10.关于synchronized的一切,我都写在这里了
大家好,我是王有志。我们已经完成了synchronized的学习,今天我们利用学习到的知识去回答一些关热点问题。
105 0