Java复习之线程的同步与死锁

这篇博客主要是复习一下java中线程的同步与死锁。

1.多线程共享数据

在多线程的操作中,多个线程有可能同时处理同一个资源,这就是多线程的共享数据

2.线程同步

解决数据共享问题,必须使用同步,**所谓同步就是指多个线程在同一个 时间段内只能有一个线程执行指定代码,其他线程要等待此线程完成之后才可以继续执行。**

线程进行同步,有以下两种方法

(1)同步代码块

synchronized(要同步的对象) { 要同步的操作; }

(2)同步方法

public synchronized void method() { 要同步的操作; }

** * 多线程共享数据的安全问题,使用同步方式解决 * 1.同步代码块 * 2.同步方法 * 同步代码会带来性能降低的问题,提高数据的安全性 */ public class ThreadDemo { public static void main(String args[]) { MyThread myThread=new MyThread(); //共享一个对象 Thread thread=new Thread(myThread,"小白"); Thread thread1=new Thread(myThread,"凤凤"); thread.start(); thread1.start(); } } class MyThread implements Runnable{ //在run()方法的外部创建标记对象 //同步标记对象,一个锁,进门关锁,出门开锁 Object object =new Object(); @Override public void run() { doMethod(); //同步代码块 // synchronized (object) // { // System.out.PRintln(Thread.currentThread().getName()+"正在拉屎"); // try { // Thread.sleep(1000); // }catch (InterruptedException ex) // { // ex.printStackTrace(); // } // System.out.println(Thread.currentThread().getName()+"拉完了"); // } } /** * 同步方法:同步的是当前对象(this) */ public synchronized void doMethod() { System.out.println(Thread.currentThread().getName()+"正在拉屎"); try { Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"拉完了"); } }

3.同步准则

当编写synchronized块时,有几个简单的准则在避免死锁和性能危险的风险方面有很大的帮助

(1)使代码块保持简短。把不随线程变化的预处理和后处理移出synchronized块。

(2)不要阻塞。如InputStream.read()

(3)在持有锁的时候,不要对其它对象调用方法。

4.线程死锁

过多的同步有可能出现死锁,死锁的操作一般是在程序运行的时候才有可能出现。

多线程中要进行资源的共享,就需要同步,但是同步过多,就可能造成死锁