一.基本的代码
线程间通信
多个线程在操作同一个资源,但是操作的动作不同
package day05;
class Res{
String name;
String sex;
}
class Input implements Runnable
{
//构造函数,初始化
private Res r;
Input(Res r)
{
this.r=r;
}
@Override
public void run() {
int x=0;
while(true){
if(x==0)
{
r.name="mike";
r.sex="man";
}
else
{
r.name="丽丽";
r.sex="女女";
}
x=(x+1)%2;
}
}
}
class Output implements Runnable
{
private Res r;
Output(Res r)
{
this.r=r;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
System.out.println(r.name+"...."+r.sex);
}
}
}
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
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();
}
}
出错
mike....女女
丽丽....女女
mike....man
丽丽....man
mike....man
mike....女女
二.增加安全锁
synchronized()
{
}
括号中可以填写的内容是
1.创建object对象
2.Input.class(因为这是唯一的)
3.使用Res r的唯一对象
package day05;
class Res{
String name;
String sex;
}
class Input implements Runnable
{
//构造函数,初始化
private Res r;
//Object object=new Object();
Input(Res r)
{
this.r=r;
}
@Override
public void run() {
int x=0;
synchronized (r) {//object
}
while(true){
if(x==0)
{
r.name="mike";
r.sex="man";
}
else
{
r.name="丽丽";
r.sex="女女";
}
x=(x+1)%2;
}
}
}
class Output implements Runnable
{
//Object object=new Object();
private Res r;
Output(Res r)
{
this.r=r;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
synchronized (r) {//object
System.out.println(r.name+"...."+r.sex);
}
}
}
}
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
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();
}
}
输出结果正确