专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 研发管理

守旧线程互斥技术

发布时间:2011-06-18 11:56:24 文章来源:www.iduyao.cn 采编人员:星星草
传统线程互斥技术
2个线程在同一个实例的方法中输出
会出现如下结果:
zhangxiaoxiang
zhangxiaoxiang
lihuoming
zhangxiaoxiang
lihuomizhangxiaoxiang
ng
zhangxiaoxiang
lihuoming
zhangxiaoxiang
如下代码可以产生错误的结果:
1、2个线程同时访问,output方法一个线程没有允许完成另一个线程就进来。
  
package cn.itcast.heima2;

public class TraditionalTreadSynchrorized {

	public static void main(String[] args) {
		new TraditionalTreadSynchrorized().init();
	}

	public void init() {
		final Outputer output = new Outputer();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output("zhangxiaoxiang");
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output("lihuoming");
				}
			}
		}).start();
	}

	 class Outputer {
		public void output(String name) {
				int len = name.length();
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
		}

	}
}
 
 

 正确代码: 

使用对象锁机制将输出体进行锁定

synchronized (this) { }

package cn.itcast.heima2;

public class TraditionalTreadSynchrorized {

	public static void main(String[] args) {
		new TraditionalTreadSynchrorized().init();
	}

	public void init() {
		final Outputer output = new Outputer();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output("zhangxiaoxiang");
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output("lihuoming");
				}
			}
		}).start();
	}

	class Outputer {
		public void output(String name) {
			int len = name.length();
			synchronized (this) {
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
			}
		}

	}
}

 

 

 

 

  2、错误代码

  虽然两个线程调用的方法不同,可是还是在同一个对象中,当一个线程没有输出完毕的时候第二个线程就打印了

system.out.println();进行换行。

 

package cn.itcast.heima2;

public class TraditionalTreadSynchrorized {

	public static void main(String[] args) {
		new TraditionalTreadSynchrorized().init();
	}

	public void init() {
		final Outputer output = new Outputer();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output("zhangxiaoxiang");
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output2("lihuoming");
				}
			}
		}).start();
	}

	class Outputer {
		public void output(String name) {
			int len = name.length();
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
		}
		public void output2(String name) {
			int len = name.length();
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
		}

	}
}

 

 

正确代码:

synchronized 关键字加在方法上默认锁定this 对象 如果在方法中需要 使用synchronized(this){}

package cn.itcast.heima2;

public class TraditionalTreadSynchrorized {

	public static void main(String[] args) {
		new TraditionalTreadSynchrorized().init();
	}

	public void init() {
		final Outputer output = new Outputer();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output("zhangxiaoxiang");
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output2("lihuoming");
				}
			}
		}).start();
	}

	static class Outputer {
		public void output(String name) {
			synchronized (this) {
				int len = name.length();
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
			}
		}
		
		public synchronized void output2(String name) {
				int len = name.length();
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
		}
		
			}
}

 

 

错误代码:

因为一个线程调用的静态方法,即两个线程不是调用的同一个对象,也就说明synchronized不是锁定的同一个对象。

package cn.itcast.heima2;

public class TraditionalTreadSynchrorized {

	public static void main(String[] args) {
		new TraditionalTreadSynchrorized().init();
	}

	public void init() {
		final Outputer output = new Outputer();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output("zhangxiaoxiang");
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					Outputer.output3("lihuoming");
				}
			}
		}).start();
	}

	static class Outputer {
		public void output(String name) {
			synchronized (this) {
				int len = name.length();
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
			}
		}
		
		public static synchronized void output3(String name) {
			int len = name.length();
			for (int i = 0; i < len; i++) {
				System.out.print(name.charAt(i));
			}
			System.out.println();
		}

	}
}

 

 正确代码如下:

因为需要锁定静态对象 所以要使用Outputer.class

package cn.itcast.heima2;

public class TraditionalTreadSynchrorized {

	public static void main(String[] args) {
		new TraditionalTreadSynchrorized().init();
	}

	public void init() {
		final Outputer output = new Outputer();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					output.output("zhangxiaoxiang");
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					Outputer.output3("lihuoming");
				}
			}
		}).start();
	}

	static class Outputer {
		public void output(String name) {
			synchronized (Outputer.class) {
				int len = name.length();
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
			}
		}
		
		public static synchronized void output3(String name) {
			int len = name.length();
			for (int i = 0; i < len; i++) {
				System.out.print(name.charAt(i));
			}
			System.out.println();
		}

	}
}

 

 

 

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: