多线程同步:
1.同步代码块
2.同步方法
3.Lock机制
当使用多个线程访问同一资源的时候,且多个线程中对资源有写操作,就容易出现线程安全问题。比如,如下是三个线程如同三个窗口售票,同时对tickets进行操作即售票,就会引发线程安全问题。
解决方式是:多线程同步。
package com.thread.exe;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Demo1_thread {
public static void main(String[] args) {
/*
多线程同步:
1.同步代码块
2.同步方法
3.Lock机制
创建线程类:
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法
*/
/*同步代码块
new Thread(new Mythread(),"窗口1").start();
new Thread(new Mythread(),"窗口2").start();
new Thread(new Mythread(),"窗口3").start();*/
/*非静态同步方法
Mythread mt = new Mythread();
new Thread(mt,"窗口1").start();
new Thread(mt,"窗口2").start();
new Thread(mt,"窗口3").start();*/
//Lock锁机制
Mythread mt = new Mythread();
new Thread(mt,"窗口1").start();
new Thread(mt,"窗口2").start();
new Thread(mt,"窗口3").start();
}
}
class Mythread implements Runnable{
private int tickets = 100;
private static Object obj = new Object(); //为同步代码块创建锁对象,为了保持一致,加上static
Lock l = new ReentrantLock(); //Lock锁也称为同步锁,同理也要保证多线程中的锁对象一致
@Override
public void run() {
while(true) {
//1.同步代码块,需要创建锁对象,且所有线程的所对象要一致才能同步
/*synchronized(obj) {
if(tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "买第几" + tickets + "号票");
tickets--;
}
}*/
/* 2.同步方法,在方法声明上加上synchronized的关键字
selltickets();
*/
//3.Lock机制,比前两者更加强大
l.lock(); //在可能出现线程安全的代码之前,调用lock()方法 获取锁
if(tickets > 0) {
try {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "买第几" + tickets + "号票");
tickets--;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//无论程序是否异常,都会将锁释放掉
l.unlock(); //结束时,调用unlock()方法 释放锁
}
}
}
}
/*public synchronized void selltickets() { //非静态同步方法的锁对象是该对象本身(this)
//静态同步方法的锁对象是本类的字节码对象Mythread.class
if(tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "买第几" + tickets + "号票");
tickets--;
}
}*/
}