码迷,mamicode.com
首页 > 编程语言 > 详细

26 多线程(六)——线程安全 synchronized

时间:2019-12-05 13:18:01      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:img   rac   getname   cat   ret   catch   pre   err   影响   

关键字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(){...}

  

26 多线程(六)——线程安全 synchronized

标签:img   rac   getname   cat   ret   catch   pre   err   影响   

原文地址:https://www.cnblogs.com/Scorpicat/p/11988453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!