600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > java多线程中的volatile和synchronized用法分析

java多线程中的volatile和synchronized用法分析

时间:2021-04-14 03:02:23

相关推荐

java多线程中的volatile和synchronized用法分析

Java|java教程

java 多线程

Java-java教程

本文实例分析了java多线程中的volatile和synchronized用法。分享给大家供大家参考。具体实现方法如下:

招聘小程序源码,vscode代码地图,ubuntu好用么,tomcat 死锁问题,sqlite指定条数,云服务器环境,jquery手风琴插件效果,前端框架汉得,用python写简单爬虫,php武器类,上海seo网站优化服务,qq微信网站源码,网页淘宝怎么联系客服代码,kt模板是什么,app下载页面模板,网站管理系统 php,水印攻击matlab程序lzw

package com.chzhao;public class Volatiletest extends Thread { private static int count = 0; public void run() { count++; } public static void main(String[] args) { Thread threads[] = new Thread[10000]; for (int i = 0; i < threads.length; i++) { threads[i] = new Volatiletest(); } for (int i = 0; i < threads.length; i++) { threads[i].start(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); }}

代码如上,期待输出的是10000,然后,由于count++不是线程安全的,所以输出经常会小于10000.

表白的的程序源码,vscode调节代码大小,ubuntu 主题 卡,tomcat高并发模式,青春爬虫,php邮件插件,武汉seo的优化渠道,php收藏网站,国外网站模板lzw

为了解决这个问题,增加了volatile关键字。

开放网站源码,vscode终端设置字体,ubuntu git 重装,tomcat 国产化,sqlite字符串重复次数,蜜袋鼯用爬虫玻璃箱养可以吗,可以打开php,石家庄专业seo公司,中国站长站网站分析实验报告,简单的介绍网站模板lzw

package com.chzhao;public class Volatiletest extends Thread { private volatile static int count = 0; public void run() { count++; } public static void main(String[] args) { Thread threads[] = new Thread[10000]; for (int i = 0; i < threads.length; i++) { threads[i] = new Volatiletest(); } for (int i = 0; i < threads.length; i++) { threads[i].start(); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); }}

修改之后,还经常输出不是10000的值。

修改为synchronized形式,代码如下:

package com.chzhao;public class SynchronizedTest extends Thread { private static int count = 0; public void run() { synchronized (LockClass.lock) { count++; } } public static void main(String[] args) { Thread threads[] = new Thread[10000]; for (int i = 0; i < threads.length; i++) { threads[i] = new SynchronizedTest(); } for (int i = 0; i < threads.length; i++) { threads[i].start(); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); }}

package com.chzhao;public class LockClass { public static byte[] lock = new byte[0];}

这样修改之后,输出是10000.

这样是否说明volatile这个关键字完全没用呢?只有synchronized才能保证线程安全?

说明:

Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。

也就是说,在某些情况下,volitile比synchronized用起来更方便,当然,同步性更差一点。

更多java多线程中的volatile和synchronized用法分析相关文章请关注PHP中文网!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。