- package cn.darkhorse.exerrice;
- /**
- * 题目:子程序运行10次,运行主程序100次,子程序在运行10次,主程序在运行100次,来回往复50次
- * */
- public class TraditionalSynchronizedTest {
-
- public static void main(String[] args) {
- //实例化锁的对象
- final Business b = new Business();
- //子线程
- new Thread(){
- @Override
- public void run(){
- for(int i = 1;i <= 50 ; i++){
- b.sub(i);
- }
- }
- }.start();
- //主线程
- for(int i = 1;i <= 50 ; i++){
- b.main(i);
- }
- }
- }
- /**
- * 总结经验
- * 1.实际的编程中,我们经常把一类操作共同资源的方法,放在同一个类中.
- * 2.在多线程编程中,我们把锁的代码(操作共同资源的代码),提取出来成一个方法,并不放在多线程执行的代码中。
- * 这样做使思路更加的清晰,更利于我们分析问题
- *
- *
- * */
- class Business{
-
- private boolean sControl = true;
- /**
- * 一般编程时,用synchronized来控制同步锁
- * 也就是在这里进行互斥操作
- * 对同一个锁的对象持有和释放
- * */
- public synchronized void sub(int j){
- while(sControl){//判断两次 比if多一次, 进入和出来的时候 提高安全性
- try {
- this.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- for(int i = 1;i<=10;i++){
- System.out.println("sub execute of " + i + " count of " + j);
- }
- sControl = true;
- this.notify();
- }
-
- public synchronized void main(int j){
- while(!sControl){
- try {
- this.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- for(int i = 1; i <= 100;i++){
- System.out.println("main execute of " + i + " count of " + j);
- }
- sControl = false;
- this.notify();
- }
- }
复制代码 |