class Test
{
object o=new object();//锁标识
void M(){
lock(o){
//A处:一些语句
}
}
Thread M2(){
Thread t=new Thread(this.M);
return t;
}
void App(){
Thread[] ts=new Thread[2];
ts[0]=this.M2();
ts[1]=this.M2();
for(int i=0;i<ts.Length;i++){
ts[i].Start();
}
}
}
执行App方法时 ts[i].Start();执行this.M1方法因为有lock所以在A处是不会挂起的
现在我想问,这个挂起是指 不会在执行中 存在ts[0]时有ts[1]出现或相反, 而操作系统的不同进程之间来看 它依然是会挂起的只是不出现 t[i]之间的 错乱,还是说 绝对的,操作系统所有进程都停下来等 某个ts[i]当它在执行lock段(A处)代码时我倾向于认为 lock只是起到 ts[i]之间不错乱执行 而不是上述的后面一种情况,全部停下来等它一个线程的在lock段的工作.这样来说如果lock段代码中的 值依然是 不保险的,除非是后一种情况大家认为呢,还是我的分析根本就是错的..
{
object o=new object();//锁标识
void M(){
lock(o){
//A处:一些语句
}
}
Thread M2(){
Thread t=new Thread(this.M);
return t;
}
void App(){
Thread[] ts=new Thread[2];
ts[0]=this.M2();
ts[1]=this.M2();
for(int i=0;i<ts.Length;i++){
ts[i].Start();
}
}
}
执行App方法时 ts[i].Start();执行this.M1方法因为有lock所以在A处是不会挂起的
现在我想问,这个挂起是指 不会在执行中 存在ts[0]时有ts[1]出现或相反, 而操作系统的不同进程之间来看 它依然是会挂起的只是不出现 t[i]之间的 错乱,还是说 绝对的,操作系统所有进程都停下来等 某个ts[i]当它在执行lock段(A处)代码时我倾向于认为 lock只是起到 ts[i]之间不错乱执行 而不是上述的后面一种情况,全部停下来等它一个线程的在lock段的工作.这样来说如果lock段代码中的 值依然是 不保险的,除非是后一种情况大家认为呢,还是我的分析根本就是错的..
解决方案 »
- GDI图形倍控件遮挡-----求解决方法
- 如何在winform程序中,调用xp系统的记事本和计算器?
- ds.Tables[0].Rows.Count > 0无法找到表0
- C# timer的用法
- 就简单的语句也要放存储过程?
- 关于vs2005的office编程,为什么我新建项目,却总是找不到office模板,以致无法进行编程?
- JMAIL发信问题,急~~~~
- 高难度
- C# 简单应用,连接oracle数据库,本机可以正常运行,其它电脑则报错,求救求指导!
- 问一个问题,比较复杂,如何使用c#编一个程序,把数据库中的某个字段(比如一个试题库的试题内容字段),按照一定的格式输出到word文档
- C++的Dll访问C#编写的winform的函数
- 请教下,做播放器遇到的问题
//A处:一些语句
}
A处的代码只能有一个线程执行。如果创建了2个线程t1、t2.当t1执行A处代码的时候,t2发现是被锁的,t2只能等待锁的解除。等到t1完成A处代码,t1释放了锁。t2就会执行。我是这么理解的。
X.i;或X.iis中的值 操作了它们,在这个线程执行lock(o)段(A处代码)期间,那么 这个线程一样 出问题..为必然 是原子的?即lock锁定将导致原子的操作,那么也就是说如果A处很耗时,那整个操作系统都可能出现假死现象.. 是这样的吗?
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
test t = new test();
t.i = i;
Thread th = new Thread(t.M);
th.Start();
t.SetJ();//操作了静态变量J成功。
t.SetI();//操作锁中使用的变量I失败
t.SetK();//操作锁外的变量K成功。
}
Console.WriteLine("主线程执行完毕");
Console.ReadLine();
}
}
public class test
{
public static int j;
public int i;
public int k;
object o = new object();//锁标识
public void M()
{
lock (o)
{
Thread.Sleep(2000);
Console.WriteLine("我是第" + i.ToString() + "个线程,J="+j.ToString()+"K="+k.ToString());
}
}
public void SetJ()
{
j++;
}
public void SetI()
{
i++;
}
public void SetK()
{
k++;
} 执行结果如下
主线程执行完毕
我是第1个线程,J=10K=1
我是第2个线程,J=10K=1
我是第3个线程,J=10K=1
我是第5个线程,J=10K=1
我是第4个线程,J=10K=1
我是第6个线程,J=10K=1
我是第7个线程,J=10K=1
我是第8个线程,J=10K=1
我是第9个线程,J=10K=1
我是第10个线程,J=10K=1
t.SetI();//操作锁中使用的变量I失败
t.SetK();//操作锁外的变量K成功。这些注释是什么意思
从结果分析下
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;namespace ConsoleApplication1 {
public class ThreadLock {
static void Main(string[] args) {
for (int i = 0; i < 10; i++) {
test t = new test();
t.i = i;
Thread th = new Thread(t.M);
th.Start();
t.SetJ();//操作了静态变量J成功。
t.SetI();//操作锁中使用的变量I失败
t.SetK();//操作锁外的变量K成功。
}
Console.WriteLine("主线程执行完毕");
Console.ReadLine();
}
}
public class test {
public static int j;
public int i;
public int k;
object o = new object();//锁标识
public void M() {
lock (o) {
Thread.Sleep(2000);
Console.WriteLine("我是第" + i.ToString() + "个线程,J=" + j.ToString() + "K=" + k.ToString());
}
}
public void SetJ() {
j++;
}
public void SetI() {
i++;
}
public void SetK() {
k++;
} }
}
//上面是 完全可测试代码//结果上看
i 为1到10 不重复,但可能乱序;
j 稳定的为10
k 稳定的为1
i是线程中的变量。线程启动以后,修改new的实例中的i值。i值被修改成功。然后才打印I的。所以i也修改成功了。
然后 进入子线程 这时会依次序的进入 子线程,但 进入时 只能这么认为,线程上下文环境 尚在k=1的状况下所以 这时所有的k都出来相同的1