- 在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。
也可以这里理解:线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。
同步的具体方法-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;//让多个线程共享 ticketNumprivate 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}@Overridepublic void run() {while (loop) {sell();//sell方法是一个同步方法}}}

