线程安全是多线程中一个很重要的知识点,渣渣我结合体会写一些,以便加深印象。

⑴问题原因:
当多线程对共享属性进行操作时,一个线程对多条语句只执行了一部分,还没执行完,另一个线程就参与进来进行执行,导致共享属性错误。

解决办法:
对于多操作共享属性的语句,只能让一个线程执行完。在执行过程中,另一个属性不可以参与执行
⑵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

因为知识点有点杂,所以渣渣只能总结一下。如果有错,还请指正,渣渣我感激不尽。

以上。