Java多线程-43-同步代码块

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011541946/article/details/82957183

    这篇学习java多线程中的同步代码块知识点,先不上来就去解释什么是同步。我们来思考下,什么场景下需要同步?当多线程并发,同时执行多段代码,我们希望某一段代码的执行过程中,CPU不要切换到其他线程工作,等这个代码块执行完才去干其他线程的活,这个时候就需要同步。字面不好理解,下面看看一个具体代码例子。

1.同步之前

在IDE里面敲这些代码,观察运行结果。

package thread;

public class Demo1_Sync {

	public static void main(String[] args) {
		final print p = new print();
		
		new Thread() {
			public void run(){
				while(true) {
					p.print1();
				}
			}
		}.start();
		
		new Thread() {
			public void run(){
				while(true) {
					p.print2();
				}
			}
		}.start();
	}

}

class print {
	
	public void print1() {
		System.out.print("A");
		System.out.print("n");
		System.out.print("t");
		System.out.print("h");
		System.out.print("o");
		System.out.print("n");
		System.out.print("y");
		System.out.print("\r\n");
		
	}
	
	public void print2() {
		System.out.print("learn");
		System.out.print("Java");
		System.out.print("\r\n");
	}
}

运行结果,我随机选择一些打印出来顺序不是我们想要的结果。

learnJava
learnJava
thony
Anthony
Anthony
Anthony

   上面thony这个输出就有问题,我们肯定希望输出Anthony,也就是cpu在这个时刻,调度到别的线程上工作,造成没有输出Anthony的效果。这里问题就是,我希望两个线程执行过程中,先保证print1或者print2里面打印代码都一起执行,别一会执行print1里面打印其中几个字母就跑去执行print2打印。这个问题,我们就需要用到同步。

2.synchronized关键字来实现同步

    在Java中,使用关键字synchronized加上一个锁对象,可以实现代码块同步。这个锁对象可以是任意对象,但是如果要同步,就要使用相同的锁对象,下面我们具体用代码来演示。

package thread;

public class Demo1_Sync {

	public static void main(String[] args) {
		final print p = new print();
		
		new Thread() {
			public void run(){
				while(true) {
					p.print1();
				}
			}
		}.start();
		
		new Thread() {
			public void run(){
				while(true) {
					p.print2();
				}
			}
		}.start();
	}

}

class print {
	Object o = new Object();    //新建一个任意的锁对象,任意的对象都可以
	public void print1() {
		synchronized(o) {       //这里对象o不能使用匿名类对象new Object(),无法保证锁对象是同一个
			System.out.print("A");
			System.out.print("n");
			System.out.print("t");
			System.out.print("h");
			System.out.print("o");
			System.out.print("n");
			System.out.print("y");
			System.out.print("\r\n");
		}
	}
	
	public void print2() {
		synchronized(o) {   //这里对象o不能使用匿名类对象new Object(),无法保证锁对象是同一个
			System.out.print("learn");
			System.out.print("Java");
			System.out.print("\r\n");
		}
	}
}

      运行之后,就不会出现乱序输出的情况,synchronized是Java中最长的一个关键字,就是在多线程并发中使用,用来实现代码块同步的。同步代码的好处就是,同一时间只执行一段代码,不会执行多段代码。被锁住的代码块没有执行完之前,不会执行下一段代码块,这样保证了顺序,实现了同步。

猜你喜欢

转载自blog.csdn.net/u011541946/article/details/82957183