关于多线程编程的讨论,请高手们展开来讨论一下

对于共享资源(文件、数据库的操作)的竞争问题,我想通过synchronized来解决。
但是我有几个疑惑的地方,请诸位打哥斧正!
Synchronized又有两个级别。当我将一个方法仅仅设为synchronized时,那是对象级的"锁",虽然一个对象的synchronized方法不可同时调用,却可以同时调用不同对象的同一个synchronized方法。所以这样做还没完全解决问题,因为两个用户(各有自己的OBJ对象)可以同时调用A方法同时操作共享资源。当我将A方法设为static synchronized时,则是类级的"锁"。类包含的"锁"(自动作为类的Class对象的一部分),可在一个类的范围内被相互间锁定起来,从那个类创建的所有对象都共享一"锁"。
1.按照这么理解我应该将所有涉及到的共享互锁的方法都进行类级的锁定,对象级的锁定对于多线程的应用来说没有意义啊。
2.如果我要将一个方法内的某个代码片段进行synchronized,那么是否可以这样:
synchronized(this){//但我想这个this是对象啊,估计不对
do something here!
}

多线程编程太麻烦了,看你问题我头都大了,呵呵,Sorry

建议用J2EE吧。

>>虽然一个对象的synchronized方法不可同时调用,却可以同时调用不同对象的同一个synchronized方法。所以这样做还没完全解决问题,因为两个用户(各有自己的OBJ对象)可以同时调用A方法同时操作共享资源。


为什么这么理解对象锁呢?就拿你的例子来说,A,B两个用户访问共享资源X,那么应该是X上加锁而不是在用户对象上.
还有,解决文件竞争访问应该使用NIO,解决数据库操作的竞争访问应使用事务.

>>对于共享资源(文件、数据库的操作)的竞争问题,我想通过synchronized来解决。

对于文件的竞争访问,建议使用NIO,因为它具有完备的锁机制.
而数据库的竞争访问由数据库的事务来解决.

>>synchronized(this){//但我想这个this是对象啊,估计不对
>>do something here!
>>}

这样同步代码块的方式是正确的,这也是一个对象这个代码块也是加了对象级的锁。每个对象都有一个monitor(从java.lang.Object继承而来),当在方法前加synchronized关键字,和synchronized(this)在功能上是等价的。也就是说,在方法前面加上synchronized,和把方法体用synchronized(this){方法体;}是等价的。如果不需要同步整个方法体,只要将需要同步的代码块用synchronized(this){代码块;}即可。

既然使用多线程的同步,那必然是因为多个线程会同时操作公共的数据吧,那只需要以这些公共数据(obj)为目标进行同步就行了
synchronized(obj){}

又不是一定要用synchronized(this),也不需要每个地方都进行类级别的同步