我在web程序里用了多线程我用lock来同步刚开始申明了一个全局私有静态变量
private static string ss = "";然后在需要同步的地方用locklock (ss)
{
//1000000次循环,写同一个文件
}我开了几个浏览器,同时访问这个程序我发现这个时候不会出现多个文件被占用的错误然后我把static去掉,改成private string ss = "";我开了几个浏览器,同时访问这个程序我发现这个时候也不会出现多个文件被占用的错误
然后我把lock都去掉,这个时候就出现文件被占用的错误了我有点疑问,不同的浏览器,访问程序时,不是都会实例化页面类吗?如果是申明私有非静态变量.那么不同的浏览器进程lock的是不同的ss啊为什么这个时候不会出现文件被占用的异常呢?
private static string ss = "";然后在需要同步的地方用locklock (ss)
{
//1000000次循环,写同一个文件
}我开了几个浏览器,同时访问这个程序我发现这个时候不会出现多个文件被占用的错误然后我把static去掉,改成private string ss = "";我开了几个浏览器,同时访问这个程序我发现这个时候也不会出现多个文件被占用的错误
然后我把lock都去掉,这个时候就出现文件被占用的错误了我有点疑问,不同的浏览器,访问程序时,不是都会实例化页面类吗?如果是申明私有非静态变量.那么不同的浏览器进程lock的是不同的ss啊为什么这个时候不会出现文件被占用的异常呢?
公共语言运行库通过维护一个表来存放字符串,该表称为拘留池,它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用。因此,具有特定值的字符串的实例在系统中只有一个。所以,所有的ss=""指向的对象都是一个。那么你应该就可以理解了。
而值类型没有。所以只要指向的对象是一个就OK了。
即所有静态声明的值一样的字符串都指向同一个对象,这个对象被存放在系统表里。
要验证www_123du_com(鼠·神·泪)的说法,楼主把
private string ss = "";改为
private object ss = new object();然后lock(ss)试试会不会出错,就知道string是不是
特殊的那一个了.
期待测试结果
要验证www_123du_com(鼠·神·泪)的说法,楼主把
private string ss = "";改为
private object ss = new object();然后lock(ss)试试会不会出错,就知道string是不是
特殊的那一个了.
期待测试结果
-----------------------------------------------------------------
换成object后出错了难道真是string 是特殊的?????
public static void Main(string[] args)
{
string str1 = "abcd";
string str2 = "abcd";
Console.WriteLine(object.ReferenceEquals(str1, str2));
str1 = "ff";
Console.WriteLine(object.ReferenceEquals(str1, str2));
str1 = "abcd";
Console.WriteLine(object.ReferenceEquals(str1, str2));
Console.ReadLine();
}
{
private string ss = "";
}
A instance1 = new A();
A instance2 = new A();
instance1和instance2的ss值相同,所以指向同一对象,则锁定ss效果同锁定静态对象.class A
{
private string ss = "";
public A(string s)
{
ss = s;
}
}
如果这样,为ss指定不同值,就不能lock ss了