![40ae71ee1aa9828c6e3a9a2845f78f0b.png](https://img-blog.csdnimg.cn/img_convert/40ae71ee1aa9828c6e3a9a2845f78f0b.png)
1、同步代码块:synchronized
当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步。
如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码。
synchronized关键字加上一个锁对象就可以同步代码,这个锁对象可以是任意的一个对象,只要求是同一个就行。
![7244986cbd1c3bd93768de552752ae6d.png](https://img-blog.csdnimg.cn/img_convert/7244986cbd1c3bd93768de552752ae6d.png)
现在在主函数里面创建2条线程执行:如果不加synchronized(d),可能输出print1 和print2就会出现乱序的问题(你好呀TO)。
![89512cb875aeb40a051a9781c1d729cf.png](https://img-blog.csdnimg.cn/img_convert/89512cb875aeb40a051a9781c1d729cf.png)
2、同步方法:synchronized
使用synchronized关键字修饰一个方法, 该方法中所有的代码都是同步的。
![5aa0af7239d74f23d2f0154d6b4a8996.png](https://img-blog.csdnimg.cn/img_convert/5aa0af7239d74f23d2f0154d6b4a8996.png)
注意:
非静态同步函数的锁是:this (因为创建的对象是同一个,此时的this就代表new的那个对象)
静态static的同步函数的锁是:字节码对象(因为使用 类名.方法 调用 ,类名是同一个)
3、线程安全
多线程并发操作同一数据时, 就有可能出现线程安全问题,使用同步技术可以解决这种问题, 把操作数据的代码进行同步, 不要多个线程一起操作。
![7c36c068aa614f28bd7486b4ae624ff8.png](https://img-blog.csdnimg.cn/img_convert/7c36c068aa614f28bd7486b4ae624ff8.png)