实现线程同步有三种方式:
1 同步代码块
synchronized(锁资源) {
需要同步执行的代码
}
解释:同步代码块会对资源加上资源锁,多线程访问的时候,需要先获取锁资源,并且没有拿到锁资源的线程需要等待锁资源的释放
锁资源:同一个锁资源才能实现线程同步
三种锁资源:
A this锁
B xx.class锁
C 字符串常量锁 String haha = “asd”;
测试类:
public static void main(String[] args) throws Exception{
test1();
}
public static void test1() throws Exception {
Ticket ticket = new Ticket();
new Thread(ticket,"窗口A").start();
new Thread(ticket,"窗口B").start();
new Thread(ticket,"窗口C").start();
}
Ticket类:
public class Ticket implements Runnable{
private static int count = 50;
//同步代码块
@Override
public void run() {
while (count > 0) {
synchronized (this) {
try {
Thread.sleep(100);//线程休眠
if(count>0){
System.out.println(Thread.currentThread().getName()+"售票,出售第:"+count--+"张票");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
2 同步方法
public class Ticket implements Runnable{
private static int count = 50;
//同步方法
@Override
public synchronized void run() {
while (count > 0) {
try {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"售票,出售第:"+count--+"张票");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
非静态同步方法使用的是this锁 相当于synchronized(this){ }
静态同步方法使用的是类锁 相当于synchronized(xx.class){ }
3 同步锁
public class Ticket implements Runnable{
private static int count = 50;
private Lock lock = new ReentrantLock();
public void run() {
while (count > 0) {
try {
Thread.sleep(100);
lock.lock();//执行开始之前加锁
if(count > 0) {
System.out.println(Thread.currentThread().getName()+"售票,出售第:"+count--+"张票");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
lock.unlock();//解锁
}
}
}
}