目录
Synchronized
synchronized 是 Java 中的关键字,是一种同步锁。
1 Synchronized 关键字
它修饰的对象有以下几种:
1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{} 括起来的代码,作用的对象是调用这个代码块的对象;
2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
虽然可以使用 synchronized 来定义方法,但 synchronized 并不属于方法定义的一部分,因此,synchronized 关键字不能被继承。如果在父类中的某个方法使用了 synchronized 关键字,而在子类中覆盖了这个方法,在子类中的这 个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized关键字才可以。当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此,子类的方法也就相当于同步了。
3. 修饰一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
4. 修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象。
2 售票案例-synchronized
synchronized案例demo:
package com.java.juc.sync;
/**
* 高内聚,低耦合的前提下: 线程 操作 资源类
*
*
* 3个售票员 卖30张票
* 分析:资源:票
* 属性:数量(30张)
* 操作方法:(卖)
*/
/**
* 步骤一:创建资源类,在资源类中创建属性和操作方法
* 资源类 = 实例变量 + 实例方法(高内聚)
*
*/
class Ticket{
/**
* 实例变量:票数
*/
private int number = 30;
/**
* 实例方法:操作方法-卖票
*/
public synchronized void sale(){
//判断是否有票
if(number > 0 ){
System.out.println("当前线程:"+Thread.currentThread().getName()+" 卖出1张;"+(number--)+" 剩余:"+number);
}
}
}
/**
* 步骤二:创建多个线程,调用资源类的操作方法
* @author chejuan
*/
public class SaleTicket {
public static void main(String[] args) {
//创建Ticket对象
Ticket ticket = new Ticket();
new Thread(new Runnable() {
@Override
public void run() {
//调用卖票方法
for(int i = 0 ;i < 40 ;i++){
ticket.sale();
}
}
},"AA").start();
new Thread(new Runnable() {
@Override
public void run() {
//调用卖票方法
for(int i = 0 ;i < 40 ;i++){
ticket.sale();
}
}
},"BB").start();
new Thread(new Runnable() {
@Override
public void run() {
//调用卖票方法
for(int i = 0 ;i < 40 ;i++){