linux多线程访问共享资源,多个线程访问共享对象和数据
多個線程訪問共享對象和數(shù)據(jù)有很多方式,但是可以分為兩大類:1.多線程執(zhí)行代碼相同的。2.多線程執(zhí)行代碼不同的
對于多線程執(zhí)行代碼相同的情況來說:
1)使用同一個Runnable對象,在new Thread的時候放入相同的這個對象
public?static?void?main(String[]?args)?{
Runnable?r?=?new?Runnable()?{
int?num?=?100;
@Override
public?synchronized?void?run()?{
System.out.println(++num?+?"==add");
}
};
Thread?t1?=?new?Thread(r);
Thread?t2?=?new?Thread(r);
Thread?t3?=?new?Thread(r);
t1.start();
t2.start();
t3.start();
}
對于多線程代碼不同的情況來說:
1)將需要共享的對象或者數(shù)據(jù)放入另一個對象中,這個對象對外提供對其操作的方法,由不同的線程調(diào)用。
class?Number?{
int?num?=?100;
public?int?add()?{
return?++num;
}
public?int?del()?{
return?--num;
}
}
Runnable對象中使用同一個Number對象
public?static?void?main(String[]?args)?{
final?Number?num?=?new?Number();
Runnable?rAdd?=?new?Runnable()?{
@Override
public?synchronized?void?run()?{
System.out.println(num.add()?+?"==add");
}
};
Runnable?rDel?=?new?Runnable()?{
@Override
public?synchronized?void?run()?{
System.out.println(num.del()?+?"==del");
}
};
Thread?t1?=?new?Thread(rAdd);
Thread?t2?=?new?Thread(rDel);
Thread?t3?=?new?Thread(rAdd);
t1.start();
t2.start();
t3.start();
}
2)將Runnable寫成內(nèi)部類的形式,然后將需要共享的對象和數(shù)據(jù)寫成外部類的成員變量。
class?Number{
int?num?=?100;
Runnable?r_add?=?new?Runnable()?{
@Override
public?synchronized?void?run()?{
System.out.println(++num+"==add");
}
};
Runnable?r_del?=?new?Runnable()?{
@Override
public?synchronized?void??run()?{
System.out.println(--num+"==del");
}
};
}
然后通過調(diào)用Number對象中的內(nèi)部類對象來實現(xiàn)。
public?static?void?main(String[]?args)?{
Number?n?=?new?Number();
Thread?t1?=?new?Thread(n.r_add);
Thread?t2?=?new?Thread(n.r_del);
t1.start();
t2.start();
}
------------------------------------------------------------------------------
還有一種方法簡單粗暴,就是把需要共享的對象和數(shù)據(jù)用static修飾。
總結(jié)
以上是生活随笔為你收集整理的linux多线程访问共享资源,多个线程访问共享对象和数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 存储过程设置回滚点,(转)
- 下一篇: mysql更新多条数据6_mysql语句