十一、隐式锁
隐式锁是互斥锁的一种,应用于不同线程面对同一个任务的情况,可以通过关键字 synchronized 对代码块或方法进行锁定,被锁定的代码块或方法在同一时刻只能被一个线程调用,其他线程只能等待上一个线程执行完毕解锁之后才能调用。
(一)synchronized 锁定代码块
public class Task extends Thread{
static Integer i=5; //加上static,是因为main方法里实例化了两个Task对象,如果不加static,就等于task1和task2各自处理各自的i,这样锁就失去了意义。
public void run()
{
while(i>0)
{
synchronized(i) //括号内的参数为对象,所以如果是基本类型要转为包装类。
{
System.out.println("线程:"+Thread.currentThread()+"输出 "+i);
i--;
}
//在释放锁之后还让线程休眠100毫秒,是为了让该线程继续占用时间,而其他线程有足够的时间抢到锁。
try {Thread.sleep(100);}
catch (InterruptedException e) {e.printStackTrace();}
}
}
public static void main(String[] args)
{
Task task1=new Task();
Task task2=new Task();
task1.start();
task2.start();
}
}
本案例中,由于 Task 继承的是 Thread 类,导致 Task 的实例化对象既是线程,又是一个具体的实例化对象,因而锁定对象前面要添加 static 关键字。如果 Task 实现的是 Runnable 或 Callable 接口,那么 Task 的实例化对象就只是一项任务,可以将该任务添加至不同的线程,因而不需要用 static 关键字修饰,这也是我们多数情况下不偏向于继承 Thread 类的原因。
(二)synchronized 锁定方法
public class Task implements Runnable{
public synchronized void run() //锁定方法
{
for(int i=0;i<=3;i++)
{
System.out.println("线程为:"+Thread.currentThread().getName()+"输出"+i);
}
}
public static void main(String[] args)

最低0.47元/天 解锁文章
800

被折叠的 条评论
为什么被折叠?



