java中Thread类与Runnable接口实现资源共享的疑问

Python06

java中Thread类与Runnable接口实现资源共享的疑问,第1张

public

class

ThreadNotShare

extends

Thread{

private

int

share

=

5

public

void

run(){

for(int

i

=

0

i

<

50

i++)

if(this.share

>

0){

System.out.println("shar

=

"

+

this.share--)

}

}

public

static

void

main(String

args[])

{

ThreadNotShare

t1

=

new

ThreadNotShare()

ThreadNotShare

t2

=

new

ThreadNotShare()

ThreadNotShare

t3

=

new

ThreadNotShare()

t1.start()

t2.start()

t3.start()

}

}

上面是一个继承Thread之后,因为由一个线程类分别构造了3个对象,所以各自有各自的数据,对象之间是数据不共享的

至于楼主的问题

例二表面看是继承了一个Thread类,但是调用的方法依旧是把一个线程类的对象交给Thread去构造,和实现Runnable接口在本质上没有任何区别不是吗,都是由一个对象构造出的线程,当然是共享同一份数据了

如果该方法不涉及写公共的资源比如一个静态的变量或者写文件,修改某个数据库的值的时候没有影响

比如你这个类里的方法只是对输入的参数做一个计算然后返回计算的值就没有影响。

但是如果是修改公共的资源比如修改数据库中存储的一个value则有可能出现问题,如:

public void writeDb(String key, String value) {

collectiondb()

write(key, value)

closeDbCollection()

}

因为Java的线程运行顺序是不一定的,可以第一个线程运行完连接数据库到后挂起了,这时候第二个线程开始运行,如果你的collectiondb()处理使用的是类中的一个实例变量Connection conn来保存数据库的连接,当第二个线程运行完毕以后conn也被关闭了,第一个线程继续执行write函数写数据库值的时候就会抛出异常。

这是一个例子,还有其他可能产生脏数据的问题

多线程如果使用公共资源的话最好在方法上声明synchronized关键字让其同步