源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

解析Java线程同步锁的选择方法

  • 时间:2022-09-25 10:39 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:解析Java线程同步锁的选择方法
[b]在需要线程同步的时候如何选择合适的线程锁? [/b]例:选择可以存入到常量池当中的对象,String对象等  
[u]复制代码[/u] 代码如下:
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();     } }
线程类:
[u]复制代码[/u] 代码如下:
public class MyThread1 extends Thread {     SyncTest syncTest;     @Override     public void run()     {         syncTest.method(this.getName());     } }
本来应该是要实现线程thread1和thread2同步,线程thread3和thread4同步的,但结果呢? 却是使得线程thread1、thread2、thread3、thread4同步了,很是郁闷。 我推荐选用的同步锁对象:
[u]复制代码[/u] 代码如下:
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数组充当同步锁对象,不会产生很诧异的错误同时不会占用很大内存。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部