坚持学习,总会有一些不一样的东西。
一、由单例模式引入
引用一下百度百科的定义——
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
文字定义总是很含糊,举个反例就很清楚了,想起之前总结过单例模式,就从单例模式开始吧。如果不清楚单例模式的新同学,可以看一下这篇总结:
从结果可以清楚地看到一个线程进入同步代码块之后,另一个线程阻塞了,需要等到前者释放锁之后,它获得锁了才能进入同步代码块。
上面代码中,我们创建的 lock 对象作为锁。用 synchronized 修饰方法又是什么充当了锁呢?
synchronized 修饰方法
以关键字 synchronized 修饰的方法就是一种横跨整个方法的同步代码块,其中该同步代码块的锁就是调用该方法的对象。
class A {     public synchronized void a(){         System.out.println("hello");     } }等价于
class A {     public void a(){         synchronized(this) {             System.out.println("hello");         }     } }静态方法用 类名.方法名 来调用,以关键字 synchronized 修饰的静态方法则以 Class 对象作为锁。
class A {     public static synchronized void a(){         System.out.println("hello");     } }等价于
class A {     public static void a(){         synchronized(A.class) {             System.out.println("hello");         }     } }写个demo测试一下:
public class A {     public static void main(String[] args) {         A obj_a = new A();         new Thread() {             @Override             
                        
                        
                    