关于线程的一些事:知识点1:synchronized有三种写法: 第一种:同步代码块 灵活 synchronized(线程共享对象){ 同步代码块; } 如果线程共享对象传入了一个字符串(位于常量池,所有对象共享), 就表明所有对象对应一把锁; 但是如果线程共享对象传入this(当前对象),那么就表明只有相同对象才共享 所以就是一个对象对应一把锁; 第二种:在实例方法上使用synchronized 表示共享对象一定是this 并且同步代码块是整个方法体。 一个对象对应一把锁 第三种:在静态方法上使用synchronized 表示找类锁。 类锁永远只有1把。 就算创建了100个对象,那类锁也只有一把。 对象锁:1个对象1把锁,100个对象100把锁。 类锁:100个对象,也可能只是1把类锁。知识点2:Java中有三大变量在线程中的情况 实例变量:在堆中。 静态变量:在方法区。 局部变量:在栈中。 以上三大变量中: 局部变量永远都不会存在线程安全问题。 因为局部变量不共享。(一个线程一个栈。) 局部变量在栈中。所以局部变量永远都不会共享。 实例变量在堆中,堆只有1个。 静态变量在方法区中,方法区只有1个。 堆和方法区都是多线程共享的,所以可能存在线程安全问题。 局部变量+常量:不会有线程安全问题。 成员变量:可能会有线程安全问题。