【好程序员训练营】-Java多线程与并发(二)之线程同步

 android培训——我的java笔记,期待与您交流!

线程同步

1 . 多线程共享数据
在多线程操作中, 多个线程有可能同时处理同一个资源, 这就是多线程中的共享数据。 举个不太恰当的例子简单理解一下,图中是小新家的厕所茅坑,但是家里只有一个那这就是一个“资源”,那么家里的所有人都共享这同一个“资源”,也就是所谓的多线程共享数据

可以明显的看出多线程共享数据带来的问题,就是会造成数据的不确定性!就好比小新正在上着厕所,此时小新爸爸来了, 此时相当于一个资源两个人在抢, 那这就会出现问题, 这种情况也就是我们平常所说的线程不安全, 我们到下面就要解决这个线程不安全的问题!

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

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

(1) 同步代码块
此种方法将需要同步的操作包裹起来, 其中同步的对象可以是任意对象,一般情况下传入this,也就是当前的对象, 可以这样理解,只要传入的同步代码块中对象相同, 其他所有方法均不可访问同步代码块中的数据(资源)

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

(2) 同步方法
同步方法面向的同步对象是本身, 也就是说,如果在同一类中有两个同步方法, 当执行其中一个同步方法时不仅该 同步方法中的资源不能被外界方法使用而且另一个(可能会有多个)也不能访问, 请细细理解此段话!

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

同步准则

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

(1) 使代码块保持简洁。把不随线程变化的预处理和后处理移出synchronized 块。
(2) 不要阻塞。如InputStream.read().
(3) 在持有锁的情况下, 不要调用其他对象的同步方法。

Lock锁

JDK1.5以后出现了一种更方便实现同步的方式-并发包(Lock), 它的性能更高, 所谓性能更高不妨说起更灵活, 在需要锁的地方加锁, 在需要去掉的地方可以去掉, 对比上述的两种方法, 必须在完成相应的代码块或者相应的方法才能去掉锁,这样不免会丢失一定的性能

class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() { 
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
 }

未完待续….

以上纯属个人见解, 如有不足之处希望有高人指出, 定感激不尽, 如有喜欢交流学习经验请给我留言谢谢.

原创文章, 转载请注明出处

你可能感兴趣的:(java,多线程,线程)