- 方式二:同步方法
- synchronized 关键字直接修饰方法,表示同一时刻只有一个线程能进入这个方法,其他线程在外面等着。
public synchronized void method(){
//可能会产生线程安全问题的代码
}
- 如果操作共享数据的代码完整的声明在了一个方法中,那么我们就可以将此方法声明为同步方法即可。
- 非静态的同步方法,默认同步监视器是this静态的同步方法,默认同步监视器是当前类本身。(不一定唯一)
- 静态(static)的同步方法,默认同步监视器是当前类本身(唯一)
- synchronized 关键字直接修饰方法,表示同一时刻只有一个线程能进入这个方法,其他线程在外面等着。
- 补充:
- 使用synchronized好处:解决了线程的安全问题。
- 弊端:在操作共享数据时,多线程其实是串行执行的,性能很低。
- 代码如下:
public class SynchronizedTest12 { public static void main(String[] args) { // TODO Auto-generated method stub TicketSale2 t1=new TicketSale2(); TicketSale2 t2=new TicketSale2(); TicketSale2 t3=new TicketSale2(); t1.setName("窗口1"); t2.setName("窗口2"); t3.setName("窗口3"); t1.start(); t2.start(); t3.start(); } } class TicketSale2 extends Thread{ static int ticket=100; static 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 static synchronized void show() { if(ticket>0) { System.out.println(Thread.currentThread().getName()+"--->售卖票"+ticket); ticket--; }else { isFlag=false; } } }