1.为什么要使用synchronized
在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchronized可以保证一个线程的变化可见(可见性)
2.实现原理
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性
3.synchronized的作用
(1)确保线程互斥的访问同步代码
(2)保证共享变量的修改能够及时可见
(3)有效解决重排序问题。
4.Synchronized的两个用法:
1)对象锁
包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对 象)
2)类锁:
指Synchronized修饰静态的方法或指定锁为Class对象
5.1举栗子
先登入--http://127.16.9.146:8885/api/v1/auth/login
--http://127.16.9.146:8885/api/v1/dubbo/test
Synchronized:同步的代码块,使用的是最基本的线程同步,他锁住的是Object对象,那么第一个线程来执行的时候,他必须拿到Object这个对象的钥匙,也可以说是锁。就可以执行下面的代码块。当第二个线程执行时,它会去看能不能拿到这个锁,如果说它没有拿到的话,他必须等待第一个线程把这个锁释放掉之后,他才能往下执行
5.2举栗子
如果说每一次都要new一个对象来当锁的话,是不是有点麻烦,可以直接写this
5.3举例子
如果说代码块在一开始的时候就需要使用锁,那么就可以把Synchronized加到方法上面,相当于是Synchronized(this)
5.4举例子
是否能替换this?
不可以,因为使用的是静态方法,他在调用的时候不需要new Demo,Synchronized锁住的是两种对象,第一个是类的实例,第二个是类的字节码
5.5举例子
继承了实现了Runnable接口,那么他可以直接当成一个线程来使用,主线程new了一个Demo ,使用for循环开了五个线程,去执行Demo里的run方法
run方法加ynchronized和不加ynchronized的区别?
5.6举例子
和上面的例子差不多,只不过把Demo放到for循环里面new,
分析:输出的值是什么?
5.7举例子