多线程之synchronized(this)

使用情景:我们有时候会使用多线程但是我们需要在调用某一个实例的时候,我们需要有序,比如,卖火车票的时候,我们要先判断是否有票,然后再出售票,当多个窗口卖火车票的时候,票池就会出错。会出现一张票被多个售票窗口重复出售。
使用方法:我们可以使用synchronized(this)来给票池枷锁,保证买票的时候,只能有一个售票员控制一张票。
实验代码:

package thread;

public class SynchronizedCode implements Runnable {
	private int aa;

	public SynchronizedCode(int aa) {
		this.aa = aa;
	}

	public void run() {
		synchronized (this) {
			try {
				System.out.println("这是第一个" + aa);
				Thread.sleep(aa);
				System.out.println("-------" + aa);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		SynchronizedCode sc1 = new SynchronizedCode(2000);
     	SynchronizedCode sc2 = new SynchronizedCode(1000);
		Thread thread1 = new Thread(sc1);
		Thread thread2 = new Thread(sc2);
		thread1.start();
		thread2.start();
	}

}

实验结果:

这是第一个2000
这是第一个1000
-------1000
-------2000

上面是因为我们使用了不同对象所以出现这样的实验结果。
当我们使用同一个对象的时候,实验代码如下:

package thread;

public class SynchronizedCode implements Runnable {
	private int aa;

	public SynchronizedCode(int aa) {
		this.aa = aa;
	}

	public void run() {
		synchronized (this) {
			try {
				System.out.println("这是第一个" + aa);
				Thread.sleep(aa);
				System.out.println("-------" + aa);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		SynchronizedCode sc1 = new SynchronizedCode(2000);
//		SynchronizedCode sc2 = new SynchronizedCode(1000);
		Thread thread1 = new Thread(sc1);
		Thread thread2 = new Thread(sc1);
		thread1.start();
		thread2.start();
	}

}

实验结果如下:

这是第一个2000
-------2000
这是第一个2000
-------2000

当我们不使用synchronized的时候,实验代码如下:

package thread;

public class SynchronizedCode implements Runnable {
	private int aa;

	public SynchronizedCode(int aa) {
		this.aa = aa;
	}

	public void run() {
//		synchronized (this) {
			try {
				System.out.println("这是第一个" + aa);
				Thread.sleep(aa);
				System.out.println("-------" + aa);
			} catch (Exception e) {
				e.printStackTrace();
			}
//		}
	}

	public static void main(String[] args) {
		SynchronizedCode sc1 = new SynchronizedCode(2000);
//		SynchronizedCode sc2 = new SynchronizedCode(1000);
		Thread thread1 = new Thread(sc1);
		Thread thread2 = new Thread(sc1);
		thread1.start();
		thread2.start();
	}

}

实验结果如下:

这是第一个2000
这是第一个2000
-------2000
-------2000

通过对比我们就可以清楚的知道synchronized(this)的作用。
程序员有偿接单和程序指导加QQ:734564390

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页