Thread的生命周期
实现Runnable接口方式
在run方法中使用通达信接口规范,synchronized块
使用syncronized方法
/**
* 使用同步方法解决实现Runnable接口的线程安全问题
* 关于同步方法的总结:
* 1. 同步方法仍然涉及到同步监视器,只是不需要我们显式的声明。
* 2. 非静态的同步方法,同步监视器是:this
* 静态的同步方法,同步监视器是:当前类本身
*/
class TicketWindow3 implements Runnable {
private int ticket = 100;
@Override
public void run() {
while (true) {
show();
}
}
private 通达信接口规范,synchronized void show() {//相当于同步监视器是:this
//通达信接口规范,synchronized (this){
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ':卖票,票号为:' + ticket);
ticket--;
}
//}
}
}
public class Main3 {
public static void main(String[] args) {
TicketWindow3 w = new TicketWindow3();
Thread t1 = new Thread(w);
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.setName('窗口1');
t2.setName('窗口2');
t3.setName('窗口3');
t1.start();
t2.start();
t3.start();
}
}
继承Thread类方式
在run方法中使用通达信接口规范,synchronized块
使用syncronized静态方法
/**
* 使用同步方法处理继承Thread类的方式中的线程安全问题
*/
class TicketWindow4 extends Thread {
private static int ticket = 100;
@Override
public void run() {
while (true) {
show();
}
}
private static 通达信接口规范,synchronized void show() { //正确:使用静态方法,相当于同步监视器:TicketWindow4.class,是当前类本身
// private 通达信接口规范,synchronized void show(){ //错误:使用非静态方法,相当于同步监视器:t1,t2,t3,是三个不同的对象当做锁
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ':卖票,票号为:' + ticket);
ticket--;
}
}
}
public class Main4 {
public static void main(String[] args) {
TicketWindow4 t1 = new TicketWindow4();
TicketWindow4 t2 = new TicketWindow4();
TicketWindow4 t3 = new TicketWindow4();
t1.setName('窗口1');
t2.setName('窗口2');
t3.setName('窗口3');
t1.start();
t2.start();
t3.start();
}
}
线程安全的懒汉式单例模式
/**
* 使用同步机制,将单例模式中的'懒汉式'改写为线程安全的
*/
public class Bank {
private static Bank bankInstance = null;
public static Bank getBankInstance() {
if (null == bankInstance) {//进入通达信接口规范,synchronized前先判断,效率更高
通达信接口规范,synchronized (Bank.class) {
if (null == bankInstance) {
bankInstance = new Bank();
}
}
}
return bankInstance;
}
}
死锁问题示例
拿到sb1锁拿到sb2锁等待sb2锁
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点