技术文章 > java >  java基础 > 正文

线程同步在java中的操作

小妮浅浅

关于线程之间的调配使用,我们已经初步了解的同步的理念。那么,在实际中又有哪些方法可以实现线程的同步呢?这里我们结合了以往所学的synchronizedLockvolatile知识点,分别是两种关键字和锁的原理,可以实现多个线程进行同步的操作,下面我们就分别进行方法的讲解。

1.synchronized关键字

Synchronized修饰整个方法。

package threadTest;  
 
/** 
 * @author ww 
 * 
 */  
public class Bank {  
 
    private int count =0;//账户余额  
 
    //存钱  
    public  synchronized void addMoney(int money){  
        count +=money;  
        System.out.println(System.currentTimeMillis()+"存进:"+money);  
    }  
 
    //取钱  
    public  synchronized void subMoney(int money){  
        if(count-money < 0){  
            System.out.println("余额不足");  
            return;  
        }  
        count -=money;  
        System.out.println(+System.currentTimeMillis()+"取出:"+money);  
    }  
 
    //查询  
    public void lookMoney(){  
        System.out.println("账户余额:"+count);  
    }  
}

再看看运行结果:

余额不足  
账户余额:0  
 
余额不足  
账户余额:0  
 
1441790837380存进:100  
账户余额:100  
 
1441790838380取出:100  
账户余额:0  
1441790838380存进:100  
账户余额:100  
 
1441790839381取出:100  
账户余额:0

2.Lock

在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。

       class Bank {
            private int account = 100;
            //需要声明这个锁
            private Lock lock = new ReentrantLock();
            public int getAccount() {
                return account;
            }
            //这里不再需要synchronized 
            public void save(int money) {
                lock.lock();
                try{
                    account += money;
                }finally{
                    lock.unlock();
                }
                
            }
        }

3.volatile关键字

1volatile是变量修饰符,其修饰的变量具有可见性。

可见性就是说一旦某个线程修改了被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取的时候,可以立即获取修改之后的值。

在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰符的变量则是直接读写主存。

2)volatile可以禁止指令重排

指令重排是指编译器或者CPU为了提高程序的运行效率,可能会对输入的代码进行优化,它不保证各个语句的执行顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码中的执行结果是一致的,应用条件是单线程条件,对于并发多线程的场景下,指令重排会产生不确定的结果。

以上就是线程同步在java中的操作,这里我们推荐大家使用synchronized关键字,作为主流方法被很多人所接受,其它两种方法可以了解一下。

免费视频教程
本文原创发布python学习网,转载请注明出处,感谢您的尊重!
相关文章
 yield在java中的使用
 java中join的原理
 java线程的run方法是什么意思
 start在java线程的使用
 java main的使用
 java线程组的批量管理
 同步在java线程的理解
相关视频章节
 网络爬虫
 云端部署Web应用程序视频
 Web应用框架Flask和文件模板
 Web应用程序开发概述
 继承和多态
作者信息
推荐视频
视频教程分类