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