synchronized
实现线程间同步的方式有两种:
①使用synchronized同步代码块;
②使用synchronized关键字创建synchronized()方法
synchronized(this)、synchronized(test.class)、
public static synchronized void method(){…}三种方式都是一样的。
静态方法是被所有实例对象共享的,所以给静态方法加锁,会被视为给类加锁。
推荐使用synchronized同步代码块
synchronized同步代码块实例(解决多线程同步的问题):
线程不安全的情况,多个线程争抢同一个资源而出现的不同步的情况。使用synchronized 来让代码块加锁
public class TestTicketRunnable{
public static void main(String[] a){
TicketThread tThread = new TicketThread();
new Thread(tThread).start();
new Thread(tThread).start();
new Thread(tThread).start();
}
}
class TicketThread implements Runnable {
private int ticket = 5;
public void run(){
for (int i = 0; i < 5; i++){
synchronized(this) {//给相应的代码块加锁进行线程同步
if (ticket > 0){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖票:ticket = " + ticket--);
}
}
}
}
}
打印结果:
Thread-0卖票:ticket = 5
Thread-0卖票:ticket = 4
Thread-0卖票:ticket = 3
Thread-0卖票:ticket = 2
Thread-0卖票:ticket = 1