黑马程序员技术交流社区
标题:
多线程中关于操作同一个资源的问题!
[打印本页]
作者:
ò壞尛孩
时间:
2014-4-11 14:17
标题:
多线程中关于操作同一个资源的问题!
本帖最后由 ò壞尛孩 于 2014-4-12 22:52 编辑
class Res
{
String name;
String sex;
}
class Input implements Runnable
{
private Res r;
Input(Res r)
{
this.r=r;
}
public void run()
{
boolean flag=true;
while(true)
{
synchronized(r){
if(flag)
{
r.name="Mike";
r.sex="man";
flag=false;
}
else
{
r.name="丽丽";
r.sex="女女女女女";
flag=true;
}
}
}
}
}
class Output implements Runnable
{
private Res r;
Output(Res r)
{
this.r=r;
}
public void run()
{
while(true)
{
synchronized(r)
{
System.out.println(r.name+"..."+r.sex);
}
}
}
}
class InputOutputDemo
{
public static void main(String[] args)
{
Res r=new Res();
Input in=new Input(r);
Output out=new Output(r);
Thread t1=new Thread(in);
Thread t2=new Thread(out);
t1.start();
t2.start();
//System.out.println("Hello World!");
}
}
复制代码
在Input和Output方法中为了同步其操作的是同一个资源,在其类中添加了Res类对象作为其成员,可是在现实中我们在类似的Input和Output方法操作中并不知道我们要操作的对象类型或者是什么样的对象,除了用
private Res r;
Output(Res r)
{
this.r=r;
}
这样的方式来同步两个线程操作的资源呢?有没有别的方法!
作者:
Tking
时间:
2014-4-11 16:56
有,1.5jdk出了一把新锁,可见操作,Api文档查阅Lock包里,操作超级简单,步骤就是上锁,解锁,就这两个Lock and unLock,
作者:
你为谁归来
时间:
2014-4-11 17:32
我也是个新手,按我的理解先说下楼上的答案,他的2个线程分别操作的是Res类中的2个属性的赋值和输出。这2个线程没有冲突的地方,也就没必要使用同步代码块。也就没有楼上所说的锁的使用了。用了反而降低效率。
作者:
你为谁归来
时间:
2014-4-11 17:42
我没太看明白你这个程序的意图,如果你只是想在对Res进行赋值的同时也输出。你可以定义一个类,类中有这2个方法(你的Input和Output是2个类实现了Runnable接口,而不是2个方法)。然后当你需要使用这2个方法的时候,只要将你需要操作的资源定义成一个类继承这个类,就可以使用这2个方法了。
作者:
ò壞尛孩
时间:
2014-4-12 14:20
你为谁归来 发表于 2014-4-11 17:42
我没太看明白你这个程序的意图,如果你只是想在对Res进行赋值的同时也输出。你可以定义一个类,类中有这2个 ...
这个可以!我看后面的视频才看到!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2