多线程安全

什么是线程安全问题?

当多个线程共享一个全局变量或者静态变量,做写的时候,可能会受到其他线程的干扰,导致数据有 问题,这种现象叫做线程干扰问题。

线程安全的解决办法:

① synchronized ——自动锁

② lock----jdk1.5并发包——手动锁

synchronized的用法:

使用条件:

①必须要有两个线程以上,需要发生同步。

②多个线程想同步,必须用同一把锁。

③保证只有一个线程进行执行。

工作原理:

①有一个线程已经拿到了锁,其他线程已经有CPU执行权,一直排队,等待其他线程释放锁。

②锁在代码执行完毕或者程序抛出异常都会被释放掉。

③锁一旦被释放掉的话,其他线程就开始获取锁进去同步中去。

缺点:

工作效率非常低。

什么是同步代码块?

就是将可能会发生线程安全问题的代码,用“synchronized”给包括起来。

    synchronized(同一个数据) {

       //可能会发生线程安全问题的代码
    }


什么是同步函数?

在方法上用“synchronized”修饰,称之为同步函数。同步函数使用的是“this”锁。

什么是静态同步函数?

在同步函数上用静态关键字(static)修饰,称之为静态同步函数。静态同步函数使用当前类的字节码文件作为锁。

什么是多线程死锁?

就是同步中嵌套同步,导致锁无法释放的现象产生就是多线程死锁。

多线程三大特性:

①原子性:保证线程的独一无二、一致性,保证线程安全问题。

②可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

③有序性:程序执行的顺序按照代码的先后顺序执行。

Volatile关键字:

作用:保证线程之间可见,但是不保证线程的原子性即线程的安全问题。

使用AtomicInteger原子类:

AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减,使用“AtomicInteger”关键字可以解决“Volatile”关键字造成的线程安全问题。

原文地址:https://www.cnblogs.com/gujian2/p/12186842.html