Java 线程同步

同步代码块:在代码块前加上“synchronized”关键字,则称此代码块为同步代码块
格式:
    synchronized(同步对象){
        需要同步的代码块
    }
同步方法:方法也可以同步
格式:
    synchronized void 方法名(){}


同步代码块:

class MyThreadDemo implements Runnable {
	private int ticket=5;
	public void run() {
		for (int i = 0; i < 10; i++) {
			if (ticket>0) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("车票:"+ticket--);
			}
		}
	}
}
public class ThreadDemo04 {

	public static void main(String[] args) {
		MyThreadDemo m=new MyThreadDemo();
		Thread t1=new Thread(m);
		Thread t2=new Thread(m);
		Thread t3=new Thread(m);
		
		t1.start();
		t2.start();
		t3.start();
	}

}

 输出:

车票:5
车票:3
车票:4
车票:2
车票:0
车票:1

 车票应该从大到小递减的,说明程序执行过程中run方法里的代码块没有同步。

加入同步:

class MyThreadDemo implements Runnable {
	private int ticket=5;
	public void run() {
		for (int i = 0; i < 10; i++) {
			synchronized (this) {
				if (ticket>0) {
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("车票:"+ticket--);
				}
			}
			
		}
	}
}
public class ThreadDemo04 {

	public static void main(String[] args) {
		MyThreadDemo m=new MyThreadDemo();
		Thread t1=new Thread(m);
		Thread t2=new Thread(m);
		Thread t3=new Thread(m);
		
		t1.start();
		t2.start();
		t3.start();
	}

}

 输出:

车票:5
车票:4
车票:3
车票:2
车票:1

 


 

同步方法:

class MyThreadDemo implements Runnable {
	private int ticket=5;
	public void run() {
			tell();
	}
	public synchronized void tell() {
		for (int i = 0; i < 10; i++) {
			if (ticket>0) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("车票:"+ticket--);
		}
		}
	}
}
public class ThreadDemo04 {

	public static void main(String[] args) {
		MyThreadDemo m=new MyThreadDemo();
		Thread t1=new Thread(m);
		Thread t2=new Thread(m);
		Thread t3=new Thread(m);
		
		t1.start();
		t2.start();
		t3.start();
	}

}

 输出同上。

posted @ 2019-03-07 17:16  我的下铺刚田武  阅读(114)  评论(0编辑  收藏  举报