近段为了实现一个功能,在树结构中,修改某个节点名称时,需要同时修改这个节点所有子节点的节点全路径属性字段(类似"父父节点名称/父节点名称/子节点名称/子子节点名称"的构造)。因为在构造Update语句时,需要递归去查询子节点以及构造全路径的值,需要花费了一定的时间,等批量执行update语句时,可能子节点的某个子节点的名称又改变了,会引起冲突,故用到了synchronized,顺便了解了下实现方式,原理没深入了解,在此记录以便日后查看。
-----------------------------------------------------我是正文分割线--------------------我是正文分割线---------------------------
本文主要列举不同的同步方式,以及我理解的使用范围。
众所周知,同步分为两种用法:同步方法、与同步块。
一、同步块
1.1 类同步
· 实现方式:
1 public class JustPlayServiceImplSyn2 { 2 3 public JustPlayServiceImplSyn2(){ 4 5 } 6 private static int flag = 1; 7 public void operate() { 8 synchronized(JustPlayServiceImplSyn2.class){ 9 flag++; 10 try { 11 // 增加随机性,让不同线程能在此交替执行 12 Thread.sleep(new Random().nextInt(5)); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 flag--; 17 System.out.println("Thread: " + Thread.currentThread().getName() 18 + " /Current flag: " + flag); 19 } 20 } 21 }
· 测试代码:
1 public class JustPlay { 2 /** 3 * @param args 4 */ 5 public static void main(String[] args) { 6 new Thread("Thread-01") { 7 public void run() { 8 new JustPlayServiceImplSyn2().operate(); 9 } 10 }.start(); // 启动第一个线程 11 12 new Thread("Thread-02") { 13 public void run() { 14 new JustPlayServiceImplSyn2().operate(); 15 } 16 }.start(); // 启动第一个线程 17 } 18 }
· 使用范围:
使用范围最广,多线程多对象的同步,代码也简单,在需要同步的代码块上加上synchronized关键字,并在括号类用[类名.class]就行。
-----------------------------------------太晚了 有时间再补充--未完分割线-------------------
1.2 this同步
1.3 静态对象同步
二、同步方法
2.1 静态方法同步
2.2 非静态方法同步
时间: 2024-10-23 05:36:43