1.同步代码块
在Thread子类run()方法代码块之外套一个下面的代码
synchronized(obj) { ... //此处就是原有的run()方法代码块 }
这里的obj就是需要锁定的对象。
2.同步方法
只要在可变类中修改方法上,加上synchronized修饰即可。
注:同步方法的同步监视器是this。
3.同步锁
先在类中定义锁对象,然后在需要保证线程安全的方法中加锁(锁变量.lock()),最后再在finally块中保证释放锁(锁变量.unlock())
class abc{ //定义锁对象 private final ReentrantLock lock = new ReentrantLock(); //... //定义需要保证线程安全的方法 public void f(){ //加锁 lock.lock(); try{ //实现代码块 } //使用finally块来保证释放锁 finally{ lock.unlock(); } } }
思考:
以上方法都是为了保证线程安全才存在的,是不是也就意味着只有可变类在多线程的情况下,才需要使用到这些方法。