千家信息网

java线程同步-synchronized

发表于:2025-01-26 作者:千家信息网编辑
千家信息网最后更新 2025年01月26日,synchronized:同步(锁),可以修饰代码块和方法,被修饰的代码块和方法一旦被某个线程访问,则直接锁住,其他的线程将无法访问非静态方法的同步锁对象是this静态方法的锁同步对象是当前类的字节码
千家信息网最后更新 2025年01月26日java线程同步-synchronized
  1. synchronized:同步(锁),可以修饰代码块和方法,被修饰的代码块和方法一旦被某个线程访问,则直接锁住,其他的线程将无法访问
  2. 非静态方法的同步锁对象是this
    静态方法的锁同步对象是当前类的字节码对象

模拟火车站售票案例

同步代码块:
public class Ticket implements Runnable {

int tickets = 100;//总票数Object obj = new Object(); //锁对象@Overridepublic void run() {    //卖票    while (true) {        synchronized (obj) {            if (tickets > 0) {                try {                    Thread.sleep(10);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(Thread.currentThread().getName() + "卖出了第" + (tickets--) + "张票");            }        }    }}

}

同步方法
public class Ticket implements Runnable {

int tickets = 100;//总票数Object obj = new Object(); //锁对象@Overridepublic void run() {    //卖票    while (true) {        method();    }}public synchronized void method(){    if (tickets > 0) {        try {            Thread.sleep(10);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println(Thread.currentThread().getName() + "卖出了第" + (tickets--) + "张票");    }}

}

测试类
public class TicketTest {
public static void main(String args[]){

    Ticket t = new Ticket();    Thread t1 = new Thread(t);    Thread t2 = new Thread(t);    Thread t3 = new Thread(t);    t1.setName("窗口1");    t2.setName("窗口2");    t3.setName("窗口3");    t1.start();    t2.start();    t3.start();}

}

0