线程同步

本文记录Java学习过程中遇到的线程同步~

Java中提供了线程同步机制,它能够解决上述的线程安全问题。

线程同步的方式有两种:

  • 方式1:同步代码块
  • 方式2:同步方法

一、同步代码块

  • 同步代码块: 在代码块声明上加上synchronized
synchronized (锁对象) {
	可能会产生线程安全问题的代码
}

同步代码块中的锁对象可以是任意的对象;但多个线程时,要使用同一个锁对象才能够保证线程安全。

示例代码(使用同步代码块修改后的电影院卖票):

public class Ticket implements Runnable {
	//共100票
	int ticket = 100;
	//定义锁对象
	Object lock = new Object();
	@Override
	public void run() {
		//模拟卖票
		while(true){
			//同步代码块
			synchronized (lock){
				if (ticket > 0) {
					//模拟电影选坐的操作
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "正在卖票:" + ticket--);
				}
			}
		}
	}
}

当使用了同步代码块后,上述的线程的安全问题,解决了。

二、同步方法

  • 同步方法:在方法声明上加上synchronized
public synchronized void method(){
   	//可能会产生线程安全问题的代码
}

同步方法中的锁对象是this。

示例代码(使用同步方法修改后的电影院卖票):

public class Ticket implements Runnable {
	//共100票
	int ticket = 100;
	//定义锁对象
	Object lock = new Object();
	@Override
	public void run() {
		//模拟卖票
		while(true){
			//同步方法
			method();
		}
	}

//同步方法,锁对象this
	public synchronized void method(){
		if (ticket > 0) {
			//模拟选坐的操作
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + "正在卖票:" + ticket--);
		}
	}
}
  • 静态同步方法: 在方法声明上加上static synchronized
public static synchronized void method(){
    //可能会产生线程安全问题的代码
}

静态同步方法中的锁对象是类名.class。

标签: none