解决方案 »
- axis2 Handler模块里怎么知道调用了客户端请求的是哪个webservice方法
- spring-security3如何从数据库取资源角色信息,而不是在配置文件写死?
- 关于业务层方法出现线程死锁
- 求JavaEye账号,帮忙下个东西,急
- java 解析xml中的一段
- 寻找"structs 从零开始"这篇文章
- Dwr 获取ScriptSession问题
- 请问:在webwork里出There is no Action mapped for action name login这个错是怎么回事
- 请教一个小问题?
- 请问,tomcat是什么服务器
- 初学ssh,写了一个web(简单得不行的东西),一直错。
- Servlet action is currently unavailable(Servlet的行动是当前不可用)
也就是单例还是多例。
也就是类似struts1和struts2的区别。也就是说,
如果是struts1的模式
每次发起一个请求,都是同一个action来处理,那么写个同步块还是有效果的。
如果是struts2的模式
每次发起一个请求,都是单独的action来处理,那么写个同步也就没有效果了。
因为本来就不是一个同一个程序块在处理。应该是这个原因。再看看大家的解释吧。good luck
如果没有问题,那就是String的实例问题吧
public String test(HttpServletRequest request)
{
String str=request.getParameter("param"); synchronized (lock)
{
//
}
}
这样是有效果的,说明是单列
{ /**
* @param args
*/
public static void main(String[] args)
{
Thread t1 = new SynchronizedTest("1"+"1");
Thread t2 = new SynchronizedTest("2");
Thread t3 = new SynchronizedTest("3");
Thread t4 = new SynchronizedTest("1"+"1");
t1.start();
t2.start();
t3.start();
t4.start();
}
}public class SynchronizedTest extends Thread
{
public String num;
public SynchronizedTest(String num)
{
this.num = num;
}
@Override
public void run()
{
new SynTestShare().test(num);
}
}public class SynTestShare
{
public void test(String num)
{
System.out.println("---------------------lock");
synchronized (num)
{
System.out.println("---------------------run");
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"----时间:"+getDate()+"-------------"+num);
}
}
public String getDate()
{
Calendar cr = Calendar.getInstance();
SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss S");
return Thread.currentThread().getName()+ sdFormat.format(cr.getTime());
}
}结果:
---------------------lock
---------------------lock
---------------------run
---------------------lock
---------------------run
---------------------lock
---------------------run
Thread-0----时间:Thread-020140404 17:39:02 915-------------11
Thread-2----时间:Thread-220140404 17:39:02 915-------------3
---------------------run
Thread-1----时间:Thread-120140404 17:39:02 915-------------2
Thread-3----时间:Thread-320140404 17:39:07 926-------------11我写的一个测试列子,红色的new SynTestShare().test(num)每次都是新对象,从测试结果看来是可以同步的,太奇怪了。
synchronized (str.intern()) ,可以这样试试看。
不过最好换个思路,比如做个 Map<String, Lock> 来处理。
感谢,synchronized (str.intern())这个可以实现
synchronized(lock){
//your code......
}