线程同步
由于我们通常通过private关键字来保证数据对象只能被方法访问,所以我们争对方法提出了一套机制,就是synchronized关键字。
synchronized方法控制对象的访问,每个对象对应一个锁。
1.同步方法
public synchronized void method(int args){}
2.同步块
synchronized(锁的对象){}
缺点:若将一个大的方法声明为synchronized将会影响效率。
public class UnsafeBuyTicket {
public static void main(String[] args) {
BuyTicket station = new BuyTicket();
new Thread(station,"苦逼的我").start();
new Thread(station,"牛逼的你们").start();
new Thread(station,"可恶的黄牛党").start();
}
}
class BuyTicket implements Runnable {
private int ticketNum = 10;
boolean flag = true;
@Override
public void run() {
while (true) {
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private synchronized void buy() throws InterruptedException {
if (ticketNum <= 0) {
return;
}
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "买到了第" + ticketNum-- + "张票");
}
}
JUC安全集合扩充知识
import java.util.concurrent.CopyOnWriteArrayList;
public class TestJUC {
public static void main(String[] args) {
CopyOnWriteArrayList<String> list=new CopyOnWriteArrayList<String>();
for (int i = 0; i < 1000; i++) {
new Thread(()->{
list.add(Thread.currentThread().getName());
}).start();
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(list.size());
}
}