当前位置: 首页 > news >正文

多线程丢失更新、加锁

为什么80%的码农都做不了架构师?>>>   hot3.png

1.不加锁的情况

package test.thread;

import java.util.concurrent.locks.ReentrantLock;

public class TestSyncCurrent {

	public static void main(String[] args) {

		Shop shop = new Shop();
		
		Runnable r1 = new Client(shop, 500);
		Runnable r2 = new Client(shop, 1000);
		Runnable r3 = new Client(shop, 1500);
		Runnable r4 = new Client(shop, 500);
		Runnable r5 = new Client(shop, 1000);
		Runnable r6 = new Client(shop, 1500);
		
		new Thread(r1).start();
		new Thread(r2).start();
		new Thread(r3).start();
		new Thread(r4).start();
		new Thread(r5).start();
		new Thread(r6).start();
		new Thread(r1).start();
		new Thread(r2).start();
		new Thread(r3).start();
		System.out.println("main:" + Thread.currentThread().getName());
	}
	
	public static class Shop{
		ReentrantLock lock = new ReentrantLock();
		private int count = 0;
		//volatile int count = 0;
		
		public int add(long delay){
			try {
				System.out.println(Thread.currentThread().getName() + ":add:start:");
				//lock.lock();
				Thread.sleep(delay);
				count ++;
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			} finally{
				//lock.unlock();
				System.out.println(Thread.currentThread().getName() + ":add:end:");
			}
			return count;
		}
	}
	
	public static class Client implements Runnable {
		
		private Shop shop;
		private long delay;
		
		public Client(Shop shop, long delay) {
			this.shop = shop;
			this.delay = delay;
		}

		@Override
		public void run() {
			for(int i=0; i<10; i++) {
				try {
					//Thread.sleep(500);
					int ret = shop.add(delay);
					System.out.println("result:" + ret);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

9 个线程,每个线程运行10次,count结果应该是 90,实验大致结果: 60 < count < 88 浮动, 运行时间约为: 15秒

2. count 使用 volatile 修饰 结果 与 1 大致相同,求解释哪里出问题了。

3. ReentrantLock 加锁后,结果正确,运行时间: 90秒

具体结果正在分析中。

转载于:https://my.oschina.net/gofan/blog/77173

相关文章:

  • ds存储上增加lun的容量,aix下的相应卷组大小怎么自动增加
  • 如何利用ccform自定义表单来增加自己的控件,关于Sys_FrmEle表结构与数据存储设计?...
  • id和class的区别
  • 字符串模板匹配
  • linux Perforce 使用
  • Android Activity生命周期
  • 敏捷结果30天之第十一天:高效能、慢生活
  • C++:复制构造函数在什么时候被调用?
  • js模拟hashtable
  • 取消锚(a/)点击后页面跳转的几种方法
  • 程序员面试题100题第26题——和为n连续正数序列
  • 软考 (一) 感触
  • 第二十三模板 15模板和友元
  • Android之loader
  • 第六天之还得接着采集
  • 【node学习】协程
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Java程序员幽默爆笑锦集
  • java概述
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Just for fun——迅速写完快速排序
  • Laravel5.4 Queues队列学习
  • laravel5.5 视图共享数据
  • PhantomJS 安装
  • React-redux的原理以及使用
  • Theano - 导数
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 给新手的新浪微博 SDK 集成教程【一】
  • 看域名解析域名安全对SEO的影响
  • 码农张的Bug人生 - 见面之礼
  • 前端_面试
  • 前端性能优化--懒加载和预加载
  • 用jQuery怎么做到前后端分离
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 在Unity中实现一个简单的消息管理器
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • #### go map 底层结构 ####
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (六)软件测试分工
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core 中插件式开发实现
  • .net web项目 调用webService
  • .NET 常见的偏门问题
  • .net 后台导出excel ,word
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)