C# 线程安全与 lock锁
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时对一个变量执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
lock的目的是防止多线程执行的时候出现并发操作问题,加上lock的引用类型的对象,在其锁定的区域内,在一个时刻只允许一个线程操作。
lock只能锁定一个引用类型变量,也就是锁定一个地址
class Program {
static void Main(string[] args)
{
threda t=new threda();
threda.obj.i = ;
Thread th1 = new Thread(new ThreadStart(t.hhh));
th1.Name = "th1";
th1.Start(); Thread th2 = new Thread(new ThreadStart(t.hhh));
th2.Name = "th2";
th2.Start();
}
} class threda
{
public static sss obj = new sss(); public void hhh()
{
lock (obj)
{
for (int i = ; i < ; i++)
{
Thread.Sleep(); if (obj.i >)
{
obj.i--;
Console.WriteLine("当前线程名:"+Thread.CurrentThread.Name+", obj.i= " + obj.i);
}
}
}
} } class sss
{
public int i ;
}
加锁和不加锁运行的结果有区别 :
加锁后:i的值会一个个递减,不会出现跳跃,不会出现重复输出,一直到0值;
不加锁:i的值输出会出现跳跃,不连续递减,可能还会出现-1值输出;
原因:加锁后,一个时刻只能有一个线程执行被锁区域的代码,两个线程都是有先后顺序执行的,所以不会出现间断输出。
C# 线程安全与 lock锁的更多相关文章
- 线程高级篇-Lock锁实现生产者-消费者模型
Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...
- 线程高级篇-Lock锁和Condition条件
浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其 ...
- 线程同步Lock锁
Lock接口历史 java1.5版本之前只有synchronized一种锁,lock是java1.5版本之后提供的接口.lock接口与synchronized接口功能相同,但是需要手动获取锁和释放锁. ...
- java多线程 synchronized 与lock锁 实现线程安全
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们模 ...
- 5.lock 锁
中断: 线程实例.interrupt(); lock锁的使用 package com.jlong; import java.util.concurrent.locks.Condition; imp ...
- 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型
本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
- Lock锁_线程_线程域
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
随机推荐
- node知识积累
// 在node的应用程序中,执行异步操作的函数将回掉函数最为最后一个参数,回掉函数接收错误对象作为第一个参数 var fs = require('fs') fs.readFile('input.tx ...
- 完美解决苹果电脑mac终端无法输入大写T的问题
[本文出自天外归云的博客园] 最近突然发现我的苹果电脑mac终端无法输入大写字母T,今天终于在同事的帮助下解决了!之前在网上查解决方法,感觉步骤描述欠佳!今天记录一下这个踩坑经验: 完美解决! 首先打 ...
- PHP 图片处理类 错误处理方法:
call an undefined function exif_imagetype() 打开扩展php.ini 将 ; 去掉: extension=php_exif.dll 并将extension=p ...
- Error: failure: repodata/repomd.xml from fedora: [Errno 256] No more mirrors to try.
记录一个小问题,重新买的linux换yum源的时候一直提示: Error: failure: repodata/repomd.xml ] No more mirrors to try. 一直说那个XM ...
- php连接oracle数据库
1.先安装一下oracle instant,把oci.dll所在的目录加入PATH环境变量里 或者直接安装oracle express php_pdo_oci 依赖于oracle 的oci.dll 2 ...
- 2017 年 机器学习之数据挖据、数据分析,可视化,ML,DL,NLP等知识记录和总结
今天是2017年12月30日,2017年的年尾,2018年马上就要到了,回顾2017过的确实很快,不知不觉就到年末了,再次开篇对2016.2017年的学习数据挖掘,机器学习方面的知识做一个总结,对自己 ...
- Android ViewPage的使用(一)
ViewPage是一个简单的页面切换组件,左右滑动的话,有效果,和ListView一样 也需要配合适配器(PagerAdapter)来使用. 先来个效果图吧 先随便创建3个view页面,用于放到 Vi ...
- JQUERY双下拉框内容的左右移动
教程源码:http://bbs.php100.com/read-htm-tid-74060.html用到的方法为:appendTo() 格式:$(content).appendTo(selector ...
- C语言 · 计算时间
算法提高 计算时间 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个t,将t秒转化为HH:MM:SS的形式,表示HH小时MM分钟SS秒.HH,MM,SS均是两位数,如 ...
- 软件开发常用的linux命令心得
软件开发过程中难免要经常对主机进行配置或者部署等操作,想到一些就写一些了,以后再更新 解压命令: a.如果是tar文件,则直接用 “tar zxvf 文件名”: b.如果是zip文件,用 “unzip ...