并发:同一个对象多个线程同时操作
线程同步:当两个或多个线程同时访问同一个变量,并且一个线程需要修改这个
变量,此时需要用到线程同步,在访问时,需要加入锁机制(Synchronized。
但是会存在一些问题:
1.一个线程持有锁会导致其他所有需要此锁的线程挂起
2.在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题
3.如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置。
同步方法:public synchronized void method(int args){}
测试用例:
package cn.qlu.syn;
/**
* 线程安全:在并发时保证数据的正确性,效率尽可能高
* synchronized
* 同步方法 同步块
* @author l
*
*/
public class TestSafe implements Runnable{
private int ticketNums =20;
private boolean flag = true;
@Override
public void run() {
while(flag){
test();
}
}
//线程同步
public synchronized void test(){
if(ticketNums<=0){
flag = false;
return;
}
//模拟延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
}
public static void main(String[] args) {
//一份资源
TestSafe w = new TestSafe();
//多个代理
new Thread(w,"No1").start();
new Thread(w,"No2").start();
new Thread(w,"No3").start();
}
}
运行结果:
No1-->20
No1-->19
No3-->18
No3-->17
No2-->16
No2-->15
No2-->14
No2-->13
No2-->12
No2-->11
No2-->10
No2-->9
No2-->8
No3-->7
No3-->6
No3-->5
No3-->4
No3-->3
No3-->2
No3-->1