解决线程安全问题
一(1).同步代码块:解决Runnable的线程安全问题
代码格式:
synchronized (同步监视器){
需要被同步的代码 //不能包含代码多了或者包含代码少了
}
被同步的代码:操作共享数据的代码
共享数据:多个线程共同操作的变量
同步监视器:俗称锁,任何一个类的对象都可以充当锁。
//同步监视器中可以用this充当锁
(2)解决继承Thread类的线程安全问题
synchronized (同步监视器){
需要被同步的代码
}
//随意造的一个对象必须是静态的statice,谨慎用this充当锁;但是可以用类.class充当锁
二(1)同步方法解决Runnable的线程安全问题
把需要被同步的代码抽离出来,再写一个方法放进去,在方法中加synchronized,并且在run方法中调此方法;把被同步的代码放进去。
private synchronized void show(){
}
(2)同步方法解决继承Thread的线程安全问题
把需要被同步的代码抽离出来,再写一个方法放进去,在方法中加synchronized,并且在run方法中调此方法,同时设置为静态方法,把被同步的代码放进去。
都涉及同步监视器,非静态同步方法中,同步监视器是this;静态方法中,同步监视器是但还能类本身
三(1)lock锁解决线程安全
首先实例化
class window implements Runnable{ int ticket=100; private ReentrantLock lock =new ReentrantLock();//实例化
然后try finalry需要被同步的程序
try { //try lock.lock(); if (ticket > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "售票口:" + ticket); ticket--; } else { break; } }finally { lock.unlock(); }
调用锁定方法
try { //try lock.lock(); //调用锁 if (ticket > 0) {
调用解锁方法
finally { lock.unlock(); //解锁 }
synchronized与lock的不同:lock需要手动的启动同步,以及手动结束同步,二sy在相应的代码执行完之后自动的释放同步监视器

浙公网安备 33010602011771号