JUC包下新的同步机制

编程

学习整理,巩固学习,马士兵视频学的,我就直接复制了,笔记种,实现都是通过CAS实现的

ReentrantLock:

/**

 * reentrantlock用于替代synchronized

 * 由于m1锁定this,只有m1执行完毕的时候,m2才能执行

 * 这里是复习synchronized最原始的语义

 * 

 * 使用reentrantlock可以完成同样的功能

 * 需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍)

 * 使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放

 * 

 * 使用reentrantlock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待

 * 

 * 使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应,

 * 在一个线程等待锁的过程中,可以被打断

 * 

 * ReentrantLock还可以指定为公平锁

 * 

 * @author mashibing

 */

package com.mashibing.juc.c_020;

import java.util.concurrent.locks.ReentrantLock;

public class T05_ReentrantLock5 extends Thread {

        

    private static ReentrantLock lock=new ReentrantLock(true); //参数为true表示为公平锁,请对比输出结果

    public void run() {

        for(int i=0; i<100; i++) {

            lock.lock();

            try{

                System.out.println(Thread.currentThread().getName()+"获得锁");

            }finally{

                lock.unlock();

            }

        }

    }

    public static void main(String[] args) {

        T05_ReentrantLock5 rl=new T05_ReentrantLock5();

        Thread th1=new Thread(rl);

        Thread th2=new Thread(rl);

        th1.start();

        th2.start();

    }

}

CountDownLatch:

倒计时锁,门闩

根据线程数量创建门闩数量,每一个线程执行完成后countDown,线程数减1,该操作是原子操作,使用CAS实现,latch.await()处于阻塞状态,

当countDown=0的时候,线程全部执行完成

public class T06_TestCountDownLatch {

    public static void main(String[] args) {

        usingJoin();

        usingCountDownLatch();

    }

    private static void usingCountDownLatch() {

        Thread[] threads = new Thread[100];

        CountDownLatch latch = new CountDownLatch(threads.length);

        for(int i=0; i<threads.length; i++) {

            threads[i] = new Thread(()->{

                int result = 0;

                for(int j=0; j<10000; j++) result += j;

                latch.countDown();

            });

        }

        for (int i = 0; i < threads.length; i++) {

            threads[i].start();

        }

        try {

            latch.await();

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("end latch");

    }

    private static void usingJoin() {

        Thread[] threads = new Thread[100];

        for(int i=0; i<threads.length; i++) {

            threads[i] = new Thread(()->{

                int result = 0;

                for(int j=0; j<10000; j++) result += j;

            });

        }

        for (int i = 0; i < threads.length; i++) {

            threads[i].start();

        }

        for (int i = 0; i < threads.length; i++) {

            try {

                threads[i].join();

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

        System.out.println("end join");

    }

}

CyclicBarrier:

栅栏

初始化时设置阻塞线程数,阻塞方法cyc.await()方法,当线程数量满足初始值的时候,执行操作打印System.out.println("人满 发车")然后执行System.out.println(Thread.currentThread().getId())

public class CyclicBarrierThread {

public static void main(String[] args) {

CyclicBarrier cyc = new CyclicBarrier(20,() -> System.out.println("人满 发车"));

for(int i = 0;i < 20;i++){

new Thread(()->{

try {

cyc.await();

System.out.println(Thread.currentThread().getId());

} catch (InterruptedException e) {

e.printStackTrace();

} catch (BrokenBarrierException e) {

e.printStackTrace();

}

}).start();

}

}

}

ReentrantReadWriteLock:

读写锁

读锁,也叫共享锁,new ReentrantReadWriteLock().readLock()

写锁,也叫排它锁,new ReentrantReadWriteLock().writeLock()

public class T10_TestReadWriteLock {

    static Lock lock = new ReentrantLock();

    private static int value;

    static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    static Lock readLock = readWriteLock.readLock();

    static Lock writeLock = readWriteLock.writeLock();

    public static void read(Lock lock) {

        try {

            lock.lock();

            Thread.sleep(1000);

            System.out.println("read over!");

            //模拟读取操作

        } catch (InterruptedException e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

    public static void write(Lock lock, int v) {

        try {

            lock.lock();

            Thread.sleep(1000);

            value = v;

            System.out.println("write over!");

            //模拟写操作

        } catch (InterruptedException e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

    public static void main(String[] args) {

        

        Runnable readR = ()-> read(readLock);

        Runnable writeR = ()->write(writeLock, new Random().nextInt());

        for(int i=0; i<18; i++) new Thread(readR).start();

        for(int i=0; i<2; i++) new Thread(writeR).start();

    }

}

Semaphore:

信号量

当初始化Semaphore时,设置可并行执行的线程数,与是否为公平锁,true公平,false非公平,当设置为1时,当前只允许一个线程执行

public class T11_TestSemaphore {

    public static void main(String[] args) {

        //Semaphore s = new Semaphore(2);

        Semaphore s = new Semaphore(2, true);

        //允许一个线程同时执行

        //Semaphore s = new Semaphore(1);

        new Thread(()->{

            try {

                s.acquire();

                System.out.println("T1 running...");

                Thread.sleep(200);

                System.out.println("T1 running...");

            } catch (InterruptedException e) {

                e.printStackTrace();

            } finally {

                s.release();

            }

        }).start();

        new Thread(()->{

            try {

                s.acquire();

                System.out.println("T2 running...");

                Thread.sleep(200);

                System.out.println("T2 running...");

                s.release();

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }).start();

    }

}

Exchanger:

线程间的通信,只能两个线程间进行数据交换,exchanger.exchange(s)为阻塞状态

public class T12_TestExchanger {

    static Exchanger<String> exchanger = new Exchanger<>();

    public static void main(String[] args) {

        new Thread(()->{

            String s = "T1";

            try {

                s = exchanger.exchange(s);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(Thread.currentThread().getName() + " " + s);

        }, "t1").start();

        new Thread(()->{

            String s = "T2";

            try {

                s = exchanger.exchange(s);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(Thread.currentThread().getName() + " " + s);

        }, "t2").start();

    }

}

 

 

以上是 JUC包下新的同步机制 的全部内容, 来源链接: utcz.com/z/516818.html

回到顶部