java对于多线程的安全问题提供了专业的解决方式: 同步代码块

1)synchronized (对象){

// 需要被同步的代码;

}

2)synchronized还可以放在方法声明中,表示整个方法

为同步方法。

例如:

public synchronized void show (String name){

….

}


java开发技术之Synchronized的使用方法_同步代码块


同步锁(Lock)

从Java 5开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。

Lock是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。

在实现线程安全的控制中,比较常用的是ReentrantLock(可重入锁),可以显式加锁、释放锁。


java开发技术之Synchronized的使用方法_java_02


互斥锁
  • 在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
  • 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
  • 关键字synchronized 来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
  • 同步的局限性:导致程序的执行效率要降低
  • 同步方法(非静态的)的锁为this。

同步方法(静态的)的锁为当前类本身。


java开发技术之Synchronized的使用方法_互斥锁_03


小结:释放锁的操作
  • 当前线程的同步方法、同步代码块执行结束
  • 当前线程在同步代码块、同步方法中遇到break、return终止了该代码块、该方法的继续执行。
  • 当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束
  • 当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。
线程的死锁问题
  • 死锁
  • 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
  • 解决方法
  • 专门的算法、原则
  • 尽量减少同步资源的定义

java开发技术之Synchronized的使用方法_同步代码块_04


想了解java培训开发技术知识,关注我,有更多精彩内容与您分享!