- 在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。
也可以这里理解:线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。
同步的具体方法-Synchronized
同步代码块
synchronized(对象){//得到对象的锁,才能操作同步代码 //需要被同步代码; }
- synchronized还可以放在方法声明中,表示整个方法-为同步方法
public synchronized void m (String name){ //需要被同步的代码 }
效果:
解决了因多个线程同时操作内存造成超卖现象!
package test;
public class Main {
public static void main(String[] args) {
//测试
SellTicket sellTicket = new SellTicket();
new Thread(sellTicket).start();//第1个线程-窗口
new Thread(sellTicket).start();//第2个线程-窗口
new Thread(sellTicket).start();//第3个线程-窗口
}
}
//实现接口方式, 使用synchronized实现线程同步
class SellTicket implements Runnable {
private int ticketNum = 100;//让多个线程共享 ticketNum
private boolean loop = true;//控制run方法变量
public synchronized void sell() { //同步方法, 在同一时刻, 只能有一个线程来执行sell方法
if (ticketNum <= 0) {
System.out.println("售票结束...");
loop = false;
return;
}
//休眠50毫秒, 模拟
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票"
+ " 剩余票数=" + (--ticketNum));//1 - 0 - -1 - -2
}
@Override
public void run() {
while (loop) {
sell();//sell方法是一个同步方法
}
}
}