- Java使用线程的同步机制解决线程的安全问题
- 方式一:同步代码块
- synchronized 关键字可以用于某个区块前面,表示只对这个区块的资源实行互斥访问。
- 格式为:
synchronized(同步监视器){
//需要被同步的代码
}
- 说明:
- 需要被同步的代码,即为操作共享数据的代码。
- 共享数据:即多个线程多需要操作的数据。
- 需要被同步的代码,在被synchronized包裹以后,就使得一个线程在操作这些代码的过程中,其它线程必须等待。
- 同步监视器,俗称锁。哪个线程获取了锁,哪个线程就能执行需要被同步的代码。可以使用任何一个类的对象充当。但是,多个线程必须共用同一个同步监视器。
- 注意:
- 在实现Runnable接口的方式中,同步监视器可以考虑使用:this。
- 在继承Thread类的方式中,同步监视器要慎用this,可以考虑使用:当前类.class。
-
public class SynchronizedTest1 { public static void main(String[] args) { // TODO Auto-generated method stub TicketSale1 t=new TicketSale1(); Thread t1=new Thread(t,"窗口1"); Thread t2=new Thread(t,"窗口2"); Thread t3=new Thread(t,"窗口3"); t1.start(); t2.start(); t3.start(); } } class TicketSale1 implements Runnable{ int ticket=100; boolean isFlag=true; @Override public void run() { // TODO Auto-generated method stub while(isFlag) { try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } show(); } } public synchronized void show() { if(ticket>0) { System.out.println(Thread.currentThread().getName()+"--->售卖票"+ticket); ticket--; }else { isFlag=false; } } }