zoukankan      html  css  js  c++  java
  • synchronized、lock及线程安全集合

    synchronized调用及写法说明:

    主调用:

        public static void synchronizedTest(){
            //此处注意:3个线程传入的同一个对象,才能共享同一个资源
            MyRunnableLock myRunnableLock=new MyRunnableLock();
    
            Thread th1=new Thread(myRunnableLock,"线程1");
            Thread th2=new Thread(myRunnableLock,"线程2");
            Thread th3=new Thread(myRunnableLock,"线程3");
    
            //静态方法的测试,不同对象也可以锁
    //        Thread th1=new Thread(new MyRunnableLock(),"线程1");
    //        Thread th2=new Thread(new MyRunnableLock(),"线程2");
    //        Thread th3=new Thread(new MyRunnableLock(),"线程3");
    
            th1.start();
            th2.start();
            th3.start();
        }

    调用类:

    import java.util.*;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /*
    *Linux中,一个进程一个独立空间,包括:代码区、堆内存地址
    * 进程下的所有线程共享进程的独立空间。
    *
    *
    * 加锁3个条件:
    * 1.是否是多线程环境
    * 2.是否有共享数据
    * 3.是否有多条语句操作共享数据
    *
    * 本质:锁对共享资源的控制就可以
    * */
    public class MyRunnableLock implements Runnable {
        private int num=100;
        private int num1=100;
        private static int num2=100;
    
        private Object o =new Object();
    
        //Lock为接口,实现类ReentrantLock
        Lock lock=new ReentrantLock();
    
    
        @Override
        public void run() {
            while (true){
    
                exectue1();
    
                exectue2();
    
                exectue3();
    
                exectue4();
            }
        }
    
        /*
         * 第一种方式:锁一个对象,此对象必须共享
         * */
        private void exectue1() {
            synchronized (o){
                if (num>0){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+":"+num);
                    num--;
                }
            }
        }
    
        /*
        * 方式二:
        * 这种写法锁的是当前对象实例 this,所以必须为同一个对象
        * */
        public synchronized void exectue2(){
            if (num1>0){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+":"+num1);
                num1--;
            }
        }
    
        /*
        * 方式三:
        * 此静态方法,锁的是当前类 MyRunnableLock.Class
        * 所有只有是new的该类,都暂用同一个锁
        * */
        public static synchronized void exectue3(){
            if (num2>0){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+":"+num2);
                num2--;
            }
        }
    
    }

    Lock:

        /*
        * 方式四:Lock
        * lock必须为同一个锁对象
        * */
        private void exectue4() {
            try {
                //开启锁
                lock.lock();
    
                if (num>0){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+":"+num);
                    num--;
                }
            }finally {
                //释放锁
                lock.unlock();
            }
        }

    线程安全集合:

        /*
        * 线程安全集合
        * */
        private void getSynchronizedList(){
            /*
            * Collections集合:
            * Vector:java封装的线程安全的
            * Collections.synchronizedList:用法比较多,将一个普通集合封装为线程安全机会,内部调用做加锁控制
            * */
            Vector<String> vector=new Vector<>();
            List<String> strings = Collections.synchronizedList(new ArrayList<String>());
    
            /*
            * Map集合:
            * Hashtable:java封装的线程安全的字典集合
            * Collections.synchronizedMapt:用法比较多,将一个普通集合封装为线程安全机会,内部调用做加锁控制
            * */
            Hashtable<Integer,String> hashtable=new Hashtable<>();
            Map<Integer, String> integerStringMap = Collections.synchronizedMap(new HashMap<Integer, String>());
    
            /*
            * StringBuffer:java封装的线程安全字符串拼接
            * StringBuilder:线程不安全
            * */
            StringBuffer sb=new StringBuffer();
            StringBuilder sb1=new StringBuilder();
        }
  • 相关阅读:
    Navicat连接mysql提示1251解决方案
    js获取select下拉框选中的值
    Windows下安装Mysql数据库
    ASP.NET MVC API以及.Core API进行安全拦截和API请求频率控制
    myeclipse 10.7中文破解版 下载安装看着一篇就够了
    Runtime exception at 0x004000bc: invalid integer input (syscall 5)
    MARS(MIPS汇编程序和运行时模拟器)
    如何将本地的代码上传到github
    JavaWeb基础
    大学什么时候开学?这款小程序告诉你!
  • 原文地址:https://www.cnblogs.com/zhuyapeng/p/13825436.html
Copyright © 2011-2022 走看看