java并发问题(SSH相关)

问一:多个客户端访问同一个带有字段的类,会不会有触发到线程安全的问题
问二:多个客户端访问同一个代码块,都会有自己的堆栈吗?
问三:Struts中单例和多例是不是为了解决线程安全的问题。才会有多例
,为每个客户端都创建一个实例

问一:多个客户端访问同一个带有字段的类,会不会有触发到线程安全的问题

答:多个客户端访问同一个带有字段的类,如果只是简单的数据读取,不做修改是没有问题的。如果做数据的修改,就会引发线程安全的问题。
一般情况下,会枷锁来控制。锁要加载,多个线程的交接处。例如,如果多个客户端访问的是同一个主机(一个jvm),通过关键字synchronized就可以控制,如果是多台主机,就要考虑分布式锁了

问二:多个客户端访问同一个代码块,都会有自己的堆栈吗?
首先堆和栈是两块内存。堆一般放的是类实例和全局变量。栈一般存放局部变量。多个客户端访问同一个代码的时候,堆是同一个,栈就不是了。

问三:Struts中单例和多例是不是为了解决线程安全的问题。才会有多例
,为每个客户端都创建一个实例
一般而言单例是为了实现数据共享(查询用).采用单例可以减少类实例的个数,从而减少内存占用和垃圾回收。
还有一些工具类也可使用单例,不会设计到共享数据的增删改查
用多例一般会设计到数据的修改,还用单例的话,就会引发线程安全的问题

答一:当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。

答三:struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。它存在着线程不安全。
而struts 1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。它是线程安全的

  1. 同时访问类,是指类变量?还是说访问同一个类对象的成员变量。其实说到底,会不会有线程安全问题,主要看会不会改变对象的状态,如果会,又没加锁,那么会有线程安全问题
  2. 可以这样理解:java虚拟机栈是线程私有的,生命周期和线程相同,所以每个线程(相当于你这里的每个客户端了)都会有自己的堆栈。
  3. 多例的时候,对象不是线程共有而是私有的,不存在共同操作的情况,所以线程安全;单例的话,和第一点一样,状态不可变也就不会引发线程安全问题,反之则可能会有线程安全问题。

多线程并发 可以加锁

第一个问题:该类不包含任何静态成员就不会有并发问题,当存在静态成员是可能会出现并发问题
第二个问题:访问同一代码块时,方法是存放在方法区,被共享,栈区会单独开辟,静态的同样会被共享,堆区只有一个;
第三个问题:单例多例可以解决并发问题,但是此处只是影响程序性能,解决并发问题一般都是在修改被共享的资源处加锁来处理

1、如果被请求的类如果是单例工作,线程不安全,如果一个请求对应一个这个类的实例,线程安全。
2、如果每个客户端对应一个线程,那么会在自己的堆栈里执行代码块,如果代码块中有共享变量的读写操作,则需要处理线程不安全问题。
3、通常情况下一些组件设计成单例可以减少对象创建,提高性能,因此在这些单例组件的设计中就会考虑并发问题,如果不能解决,或者单例不能满足系统要求,则会设计成多例的。

访问还要线程安全......我可以理解成一个变量因为被调用的多了值就变了吗? 哈哈哈哈嗝

只有涉及操作,才会考虑到多线程安全.