关于Java共享变量的思考

我们要研究一个问题,一定要问明白这个问题的本质是什么?为什么会是这样,这样可能会对以后的开发工作有很大的帮助,这个知识点,献给正在找工作的伙伴们,算是一个简单的理解,有不对之处经量提出来;

1,什么是共享变量?

2.如何解决共享变零的问题?用什么方法解决?每一个方法之间又有那些异同和相同呢?

首先在回答共享变量之前,我们应该搞清的是什么是线程安全?

对于线程的安全,通过博客我们可能会得到很多的答案,但在这里我结合一点自己的想法和感受谈谈线程安全

我想本质的问题就是:启动线程的方法是start方法,但是真正运行线程的方法是run方法,所以线程安全不安全取决于run方法中的代码的执行的结果是否一致,如果start启动的的是多个线程,而run中运行的是多个线程,如果当单个线程运行的结果和多个线程运行的结果不一样时,那么线程必定是不安全的,反之,如果这多个线程运行的结果和单个线程运行的结果是一致的,那么必然是线程安全的,也就是说,run'中的代码运行的结果是一致的,所以这个问题就解决了;下面我们回答共享变量的问题;

假如有三个线程:线程一,线程二,线程三,三个线程同时启动区访问一个共享变量x,从java虚拟机的角度来说,共享变量存在主内存中.但是变量的修改不能再主内存中修改,因此每一个变量对应的每一个线程都有一个工作内存区域,而这个区域就是每一个变量的修改的区域,也就是说:变量的修改是在工作内存中修改的,而非是在主内存中修改的,为了保证共享变量的可见性,加一个互斥锁,这个目的是保证某一段时间只能由一个线程修改变量,但是下一个线程读取变量的值,一定是在主内存中读取的,其实说白了就是一下三点:

1.主内存-------->修改后的变量,用于读取

2.工作内存------>共享变量真正修改的地方

3.互斥锁---------->保证共享变量的安全性;

volidate:

强迫修改后的值,保存在主内存中;

原子性:

sybchonized':具有可见性和原子性,volidate不具有原子性;

猜你喜欢

转载自blog.csdn.net/wb_zjp283121/article/details/78821167