前言
为了保证线程安全,我们可以采用synchronized同步关键字
一、同步代码块
优点:灵活
注意:synchronized关键字后的小括号中填写的一定是线程共享的对象,希望哪些线程进行排队,就填写这些线程的对象。
代码如下(示例):
synchronized(线程共享对象){
同步代码块;
}
二、在实例方法上使用synchronized
表示共享对象一定是this,并且同步代码块是整个方法体。
代码如下(示例):
public synchronized void HelloWorld(){
方法体;
}
三、在静态方法上使用synchronized
表示找类锁,类锁永远只有一把,就算创建100个对象,类锁也只有一把。
类锁:100个对象,也只有一把类锁。
类锁就是排他锁,为了保护静态变量的线程安全。
代码如下(示例):
public synchronized static void HelloWorld(){
方法体;
}
总结:开发中如何解决线程安全问题
第一种方案
尽量使用局部变量代替“实例变量和静态变量”。
第二种方案
如果必须是实例变量,那么可以考虑创建多个对象,
这样实例变量的内存就不共享了(一个线程对应一个对象,100个线程对应100个对象,对象不共享,就没有数据安全问题了)
第三种方案
如果不能使用局部变量,对象也不能创建多个,只能选择synchronized同步关键字,使用线程同步机制。