目录一. synchronized 实现同步代码块二. synchronized 同步代码块的特点三. synchronized 同步代码块的使用细节四. synchronized 实现同步方法五. 同步方法的注意事项六. StringBuffer类 与 synchronized 的关系一. synchronized 实现同步代码块在 Java 中当多个线程共享一个临界资源的时候就会出现抢夺临界资源的情况为了保证线程安全的执行我们就需要做出一些应对措施。syschronized 锁就可以实现同步代码块实现线程安全我们只需要将临界资源锁起来让一个线程想要访问该临界资源时需要先获取到锁才能进行操作否则就要等待。同步代码块的格式如下图所示由 synchronized 和锁对象以及括号内部的代码整体通常就称之为同步代码块二. synchronized 同步代码块的特点1没有线程执行代码块时锁默认是开放的一旦有一个线程来执行同步代码块锁自动关闭其他线程必须阻塞等待2一个线程在拿到锁执行同步代码块时只有全部执行完毕线程才会出来锁会自动释放。三. synchronized 同步代码块的使用细节synchronized 的锁对象一定要是唯一的因为一个线程能不能执行同步代码块就是要判断该线程是否拥有当前锁对象如果一个同步代码块的锁对象不是唯一的有A和B两个锁对象那么线程1获取到锁对象A去执行同步代码块线程2获取锁对象B执行同步代码块就有可能会产生线程冲突造成线程安全问题。在实际开发过程中我们通常可以使用类的字节码文件对象作为锁对象因为当前类的字节码文件对象就是唯一的。四. synchronized 实现同步方法同步方法和同步代码块实现极其相似同步代码块我们是把一段代码使用 synchronized 锁了起来而同步方法则同理它是直接将 synchronized 加在了方法上与 publicstatic 等修饰符一并写就可以了如下所示五. 同步方法的注意事项1同步方法锁住的是整个方法里面的代码2同步方法的锁对象是不需要我们自己指定的Java 已经帮我们指定好了。如果当前同步方法是静态方法则当前锁对象是当前类的字节码文件对象如果当前同步方法是非静态方法则锁对象是 this 即当前方法的调用者。六. StringBuffer类 与 synchronized 的关系我们知道Java 中的字符串是不可变的而 StringBuilder 和 StringBuffer 的类对象则是可变的这两个类的作用几乎完全一样最大的区别就是 StringBuffer 类中的方法都有 synchronized 锁如下图所示部分源码所以StringBuffer 是线程安全的而 StringBuilder 是线程不安全的当我们的程序是多线程时建议使用 StringBuffer 不使用 StringBuilder如果是单线程的使用 StringBuilder 效率更高。