在分层结构中,我用了三层,数据访问公共部分的函数都用了static,当用户访问量大时,会不会产生并发,把数据冲掉?? 学习 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用satatic是方便了一点,但不是太安全吧 会,应该用CLASS 或者SESSION 最上面是界面层,数据访问都用存储过程,其上面层有个数据访问公共类(其中的方法都是static静态方法),用来调用存储过程,再上面也就是界面层的下面层各函数(也是静态方法static),用来调用数据访问公共类中的静态方法.当我数据访问量非常大时,会不会由于STATIC产生并发,冲掉一些数据访问请求。请大家提供点意见?是全部用static好,还是全部去掉好?他们有什么优缺点? 我觉得 不能全部用 static ! 把数据访问公共类中的STATIC去掉,而把调用他们的方法留着static,怎么样? 我写了个多线程..用了个static 传递变量好象没事啊 在一个static函数中,lock一个对象就可以了。这样,再忙都不会出现在一个函数出现并发。我测试过的 class abc{ static object lockTest=new Object(); static function void Test(){ lock(lockTest) { //你的代码。 } }}这样,即使在Test()中被多个线程同时调用,但是扫行(你的代码)是,由于lock语句的存在,仍然会是单线程运行。后来的线程,会被lock(lockTest)这一句给阻赛到上一个线程把(你的代码)执行完。 多用户同时调用静态函数,会产生多个进程,本身是不会冲突的。但静态函数访问了同一静态变量时就要使用lock语句。 如果仅仅使用static方法而没有static变量的话是不会有问题的,一般线程安全的问题都是针对变量访问时发生冲突所造成的。 用static的时候,当多个client用的时候会有冲突的,用lock效率比较差,容易引起死琐,造成系统崩溃,lock 用于多线程总为了便于不让资源使用发生冲突而设计的 lock的使用中,死锁会出现在一个情况:A线程 lock(A),然后不释放A,lock(B)B线程 lock(B),然后不释放B,lock(A)如果在线程中,不使用lock(A){ lock(B){ }}的模式,而只使用单个的lock,我想不出死锁出现的理论。 晕倒,你自己做一段代码测试一下不就可以了吗?????总之,我现在做的第一个程序,目前底层网络通信已经写了2000多行,测试通过。扔一段我测试lock的代码出来,你自己看吧,能不能看懂,就看你的水平了 long addValue; object lockk=new object(); private void button3_Click(object sender, System.EventArgs e) { this.textBox3.Text=""; for (int i=0;i<20;i++) { System.Threading.Thread th=new System.Threading.Thread(new System.Threading.ThreadStart(add)); th.Start(); } } private void add() { int startTick=System.Environment.TickCount; for (int i=0;i<500000;i++) { for (int j=0;j<100;j++); //lock(lockk) //{ this.addValue+=1; //} } lock(lockk) { this.textBox3.Text+=(System.Environment.TickCount-startTick).ToString()+";"+this.addValue.ToString()+" "; } } 你可以看看,被注释的lock那一段,用和不用的区别 http://community.csdn.net/Expert/topic/4158/4158509.xml?temp=.6570093 应该没问题.哦一直用的都是static方法. 我也有同样的问题,我是在web方法中调用的static方法.我简单试了一下没什么问题.但不知到具体运行时会不会有什么问题,大家接着讨论. 如果你的static里面没有访问和操作某些可能产生冲突的对象的话,就绝对没有问题,因为多人在用这个函数的时候,可能会同时操作同一个对象,引起冲突,这样会造成灾难,解决方法,给可能引起冲突的对象加lock(obj){} 副作用:可能引起暂时某个或者某些用户响应迟缓等等 不用static 的话,就要创建事例,耗资源,当然一个无所谓,但当多了,就明显了,最好把这些方法封到业务逻辑的基类,这样就可以避免些问题 静态方法通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。如下所示:class Simple{ static void go(){ System.out.println("Go..."); }}public class Cal{ public static void main(String[] args){ Simple.go(); }}调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。静态变量静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间.class Value{ static int c=0; static void inc(){ c++; }}class Count{ public static void prt(String s){ System.out.println(s); } public static void main(String[] args){ Value v1,v2; v1=new Value(); v2=new Value(); prt("v1.c="+v1.c+" v2.c="+v2.c); v1.inc(); prt("v1.c="+v1.c+" v2.c="+v2.c); }}结果如下:v1.c=0 v2.c=0v1.c=1 v2.c=1由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。静态类通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。如下代码所示:public class StaticCls{ public static void main(String[] args){ OuterCls.InnerCls oi=new OuterCls.InnerCls(); }}class OuterCls{ public static class InnerCls{ InnerCls(){ System.out.println("InnerCls"); } }}输出结果会如你所料:InnerCls和普通类一样。详细说明网址:http://kb.csdn.net/java/articles/200503/e7563d5f-f3d8-4d9e-8f15-21e54feff5ad.html DataView只能保护行数据,不能保护列数据,是吗? 在线等,向各位请教一个JS问题 数据的读取 关于如何传值的问题,有点着急,高手进来看看,不胜感激 windows画图,显示网格 调查一下大家竟用什么开发工具? C#能编写WIN98下的数据库运用系统吗? 关于用C#写一个钩子程序的问题 为什么我认为c#是增强的脚本语言,来一次心平气和的讨论。 大家好 新年快乐 1个数据库问题 快来看啊 在c#里面怎样动态的画一个矩形???????????
应该用CLASS 或者SESSION
static object lockTest=new Object(); static function void Test(){
lock(lockTest)
{
//你的代码。
}
}
}这样,即使在Test()中被多个线程同时调用,但是扫行(你的代码)是,由于lock语句的存在,仍然会是单线程运行。后来的线程,会被lock(lockTest)这一句给阻赛到上一个线程把(你的代码)执行完。
但静态函数访问了同一静态变量时就要使用lock语句。
lock(B){
}
}的模式,而只使用单个的lock,我想不出死锁出现的理论。
object lockk=new object();
private void button3_Click(object sender, System.EventArgs e)
{
this.textBox3.Text="";
for (int i=0;i<20;i++)
{
System.Threading.Thread th=new System.Threading.Thread(new System.Threading.ThreadStart(add));
th.Start();
}
} private void add()
{
int startTick=System.Environment.TickCount;
for (int i=0;i<500000;i++)
{
for (int j=0;j<100;j++);
//lock(lockk)
//{
this.addValue+=1;
//}
}
lock(lockk)
{
this.textBox3.Text+=(System.Environment.TickCount-startTick).ToString()+";"+this.addValue.ToString()+" ";
}
}
lock(obj)
{} 副作用:可能引起暂时某个或者某些用户响应迟缓等等
通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。如下所示:
class Simple{
static void go(){
System.out.println("Go...");
}
}
public class Cal{
public static void main(String[] args){
Simple.go();
}
}
调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。
静态变量
静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间.
class Value{
static int c=0;
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
public static void main(String[] args){
Value v1,v2;
v1=new Value();
v2=new Value();
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
}
结果如下:
v1.c=0 v2.c=0
v1.c=1 v2.c=1
由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。
静态类
通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。如下代码所示:
public class StaticCls{
public static void main(String[] args){
OuterCls.InnerCls oi=new OuterCls.InnerCls();
}
}
class OuterCls{
public static class InnerCls{
InnerCls(){
System.out.println("InnerCls");
}
}
}
输出结果会如你所料:
InnerCls
和普通类一样。
详细说明网址:
http://kb.csdn.net/java/articles/200503/e7563d5f-f3d8-4d9e-8f15-21e54feff5ad.html