线程安全是多线程中一个很重要的知识点,渣渣我结合体会写一些,以便加深印象。
⑴问题原因:
当多线程对共享属性进行操作时,一个线程对多条语句只执行了一部分,还没执行完,另一个线程就参与进来进行执行,导致共享属性错误。
解决办法:
对于多操作共享属性的语句,只能让一个线程执行完。在执行过程中,另一个属性不可以参与执行
⑵JAVA对于安全问题提供了专业的解决方法:
就是同步代码块
关键字:synchronized(对象)
{
需要被同步的代码
PS。即对共享数据进行操作的代码
}
⑶括号内的对象有什么用?
对象中有锁旗标,即“锁”,或者叫“监视器”。当一个线程进入后持有锁,锁会关闭,
当进程对共享属性的一次操作完成后,锁会解开,另一个线程可以进入。
对象就是充当“锁”的作用。
⑷使用同步代码块的前提:
1.有多个线程
2.共用一个锁
⑸用同步块的利弊
好处:解决了多线程的安全问题
弊端:因为每次对共享属性进行操作,都需要对锁进行判断。消耗的运行资源,会使程序运行变慢
⑹如何找哪些代码该同步
1.明确哪些代码是多线程代码
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据的
ex:(一个关于两个账户向银行存钱的小例子)
class Bank
{
private double money = 0;
Object obj = new Object();
public void add(double x)
{
synchronized(obj)
{
money+=x;
System.out.println("now your money is "+money);
}
}
}
class User implements Runnable
{
private Bank f = new Bank();
public void run()
{
for(int i =0;i<3;i++)
f.add(100);
}
}
public class Demo1
{
public static void main(String[] args) {
User f = new User();
Thread t1 = new Thread(f);
Thread t2 = new Thread(f);
t1.start();
t2.start();
}
}
⑺同步函数
方式:在函数的修饰符中加synchronized
PS.要加在返还值类型修饰符之前
1.同步函数在一般情况下使用的锁是this
2.同步函数在被静态修饰时,使用的 锁 是该方法所在类的字节码文件的对象。即 类名.class
因为知识点有点杂,所以渣渣只能总结一下。如果有错,还请指正,渣渣我感激不尽。
以上。