多线程之间没有资源共享,不会出现死锁;有多个资源共享,就会出现数据非预期,出现线程不安全问题。 Java一般通过synchronized同步锁来支持多线程同步。 以售票为例: package com .
多线程之间没有资源共享,不会出现死锁;有多个资源共享,就会出现数据非预期,出现线程不安全问题。
Java一般通过synchronized同步锁来支持多线程同步。
以售票为例:
package com.test.thread;/**
* 描述: 演示 - synchronized 关键字
*/
public class C3Synchronized implements Runnable {
/**
* 修饰实例方法:对当前实例加锁,进入同步代码前要获得当前实例的锁
* synchronized (this) {}
*
* 修饰静态方法:对当前类对象加锁,进入同步代码前要获得当前类对象的锁
*
* 修饰代码块:指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
* private Object obj = new Object(); // 作为一个锁
* synchronized (obj) {}
*/
private int tickets = 10;
@Override
public void run() {
do {
// 调用售票方法
try {
saleTicket();
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (tickets > 0);
}
/**
* 描述: 定义一个同步方法 卖票方法
*/
private synchronized void saleTicket() throws InterruptedException {
if (tickets > 0) {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "---卖出的票" + tickets--);
}
}
/**
* 描述: 主函数
*/
public static void main(String[] args) {
C3Synchronized ticket = new C3Synchronized();
new Thread(ticket, "线程一").start();
new Thread(ticket, "线程二").start();
new Thread(ticket, "线程三").start();
new Thread(ticket, "线程四").start();
}
}
如果去掉synchronized,执行结果:
可以明显看到多个线程同时买票,结果为6的情形。