关键字synchronized可以写在方法和代码块中
- 写在普通方法中:锁住的对象时this
- 写在静态方法中:锁住的对象时class
- 写在代码块中
关于这个synchronized关键字
- 线程锁会造成性能下降
- 线程锁用在大的方法中,很影响性能
关于线程锁
- 除了使用synchronized关键字外,还可以使用另一种线程锁,本文没有收录方法
下面来看一个没有加线程锁的案例:3个线程抢票
package _20191205; /** * 线程不安全: * @author TEDU */ public class SynTest01 { public static void main(String[] args) { //一份资源 SafeWeb12306 web = new SafeWeb12306(); new Thread(web,"线程1").start(); new Thread(web,"线程2").start(); new Thread(web,"线程3").start(); } } class SafeWeb12306 implements Runnable{ //票数 private int ticketNums = 100; private boolean flag = true; @Override public void run() { while(flag) { try{ Thread.sleep(100); }catch(InterruptedException e) { e.printStackTrace(); } buy(); } } //买票:线程不安全 public void buy() { if(ticketNums<=0) { flag = false; return; } try { Thread.sleep(100); }catch(InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--); } }
它的运行结果:
会出现多个线程抢了同一张票的情况,为了避免这种情况,我们需要给关键方法加锁,在本例中,我们只需要给buy()方法加锁即可,即:
public void synchronized buy(){...}
原文地址:https://www.cnblogs.com/Scorpicat/p/11988453.html
时间: 2024-10-11 07:13:42