zoukankan      html  css  js  c++  java
  • Java线程同步锁的选择

      在需要线程同步的时候如何选择合适的线程锁?

    例:选择可以存入到常量池当中的对象,String对象等  

    public class SyncTest
    {
        private String name = "name";
    public void method(String flag)
        {
            synchronized (name)
            {
                System.out.println(flag + ", invoke method ....");
                try
                {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
        
        public static void main(String[] args)
        {
            SyncTest test1 = new SyncTest();
            
            SyncTest test2 = new SyncTest();
            
            MyThread1 myThread1 = new MyThread1();
            MyThread1 myThread2 = new MyThread1();
            myThread1.syncTest = test1;
            myThread2.syncTest = test1; 
            
            MyThread1 myThread3 = new MyThread1();
            MyThread1 myThread4 = new MyThread1();
            myThread3.syncTest = test2;
            myThread4.syncTest = test2;
            
            myThread1.start();
            myThread2.start();
            myThread3.start();
            myThread4.start();
            
        }
    
    
    }


    线程类:

    public class MyThread1 extends Thread
    {
        SyncTest syncTest;
        
        @Override
        public void run()
        {
            syncTest.method(this.getName());
        }
    
    }

    本来应该是要实现线程thread1和thread2同步,线程thread3和thread4同步的,但结果呢?

    却是使得线程thread1、thread2、thread3、thread4同步了,很是郁闷。

    我推荐选用的同步锁对象:

    package com.rcx.thread;
    
    
    public class SyncTest
    {
        // 特殊的instance变量,用于充当同步锁的对象
        private byte[] lock = new byte[0];
        
        public void method(String flag)
        {
            synchronized (lock)
            {
                System.out.println(flag + ", invoke method f....");
                try
                {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
        
        public static void main(String[] args)
        {
            SyncTest test1 = new SyncTest();
            
            SyncTest test2 = new SyncTest();
            
            MyThread1 myThread1 = new MyThread1();
            MyThread1 myThread2 = new MyThread1();
            myThread1.syncTest = test1;
            myThread2.syncTest = test1; 
            
            MyThread1 myThread3 = new MyThread1();
            MyThread1 myThread4 = new MyThread1();
            myThread3.syncTest = test2;
            myThread4.syncTest = test2;
            
            myThread1.start();
            myThread2.start();
            myThread3.start();
            myThread4.start();
            
        }
    
    
    }

    推荐使用0长度的byte数组充当同步锁对象,不会产生很诧异的错误同时不会占用很大内存。

  • 相关阅读:
    本地向GitHub提交403错误解决办法(自己的创建的项目)
    zepto-ajax跨域请求接口 jsonp 静态页面数据展示
    自定义获取url方法
    使用swiper 轮播插件ajax 请求加载图片时,无法滑动问题
    背景透明,文字不透明解决办法
    js DOM Element属性和方法整理----转载
    图像处理作业5——SIFT算法与全景图像生成
    应用连续高斯模糊后得到的σ是多少?
    Pandas学习笔记——综合练习
    Pandas学习笔记5——合并
  • 原文地址:https://www.cnblogs.com/renchunxiao/p/3079850.html
Copyright © 2011-2022 走看看