java多线程同步的五种方法

来源:互联网 发布:js是哪里的车牌 编辑:程序博客网 时间:2024/06/05 18:00

一、前几天去面试,被大师问道一些很基础的问题,感觉自己答的很不满意,闲话不多说,进入正题.

二、为什么要使用同步?
因为当我们有多个线程要同时访问同一个变量或对象时,如果这些线程中午既有读又有写操作时,就会导致变量值或者对象的状态出现混乱,从而导致程序异常,举个例子:如果同一个银行账户被连个线程操作,一个存钱1000.00,一个取1000.00,假设该账户原本为金额为0.00,如果取钱线程和存钱线程同时发生,会出现什么结果?取钱失败,账户余额:1000.00或者是取钱成功,账户余额为0.00?是不是能明确是哪一个?那么就会给银行的存取款业务带来混乱的操作局面。
这时候就需要我们的多线程同步。

三、五种线程同步的方法?
1.同步方法:使用sychronized关键字修饰方法,由于java的每个对象都有一个内置锁,当用此关键字修饰方法(静态与非静态都可修饰)时,内置锁会保护整个方法,在调用该方法时,在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
2.同步代码块:既有sychronized修饰的语句块,被该关键字修饰的语句块会被自动加上内置锁,从而实现同步。(注意:线程同步是一个高开销的操作,因此应当尽量减少同步的内容,通常没必要同步整个方法)
3.使用特殊域变量(Volatile)实现线程同步.因为Volatile不能保证原子操作导致的,因此Volatile不能代替sychronized,此外Volatile会组织编译器对代码优化,因此不建议使用它,
4.使用重入锁对线同步(javaSE5.0以上中新增了一个java.util.concurrent包来支持同步)
5.使用局部变量实现线程同步