import java.awt.AWTException; import java.awt.Robot; public class TestThread1 implements Runnable { private static String name; public TestThread1(String name){ this.name=name; } @Override public void run() { synchronized(name){ for(int i=0;i<10;i++){ try { Robot r = new Robot(); r.delay(1000); } catch (AWTException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" "+name+i); } } } public static void main(String args[]){ TestThread1 th1 = new TestThread1("A"); Thread t1 = new Thread(th1); t1.start(); TestThread1 th2 = new TestThread1("B"); Thread t2 = new Thread(th2); t2.start(); /* Robot r; try { r = new Robot(); r.delay(2000); } catch (AWTException e) { // TODO Auto-generated catch block e.printStackTrace(); } TestThread1.name="C";*/ TestThread1 th3 = new TestThread1("D"); Thread t3 = new Thread(th3); t3.start(); } }
结果:
Thread-0 D0
Thread-1 D0
Thread-1 D1
Thread-0 D1
Thread-0 D2
Thread-1 D2
Thread-1 D3
Thread-0 D3
Thread-1 D4
Thread-0 D4
Thread-1 D5
Thread-0 D5
Thread-1 D6
Thread-0 D6
Thread-1 D7
Thread-0 D7
Thread-0 D8
Thread-1 D8
Thread-1 D9
Thread-0 D9
Thread-2 D0
Thread-2 D1
Thread-2 D2
Thread-2 D3
Thread-2 D4
Thread-2 D5
Thread-2 D6
Thread-2 D7
Thread-2 D8
Thread-2 D9
发现当改变线程中static 的变量值的线程开启介入时,synchronized(static XX)便失效。
而下面的情况则未见失效,很诡异。
import java.awt.AWTException; import java.awt.Robot; public class TestThread1 implements Runnable { private static String name; public TestThread1(String name){ this.name=name; } @Override public void run() { synchronized(name){ for(int i=0;i<10;i++){ try { Robot r = new Robot(); r.delay(1000); } catch (AWTException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" "+name+i); } } } public static void main(String args[]){ TestThread1 th1 = new TestThread1("A"); Thread t1 = new Thread(th1); t1.start(); TestThread1 th2 = new TestThread1("B"); Thread t2 = new Thread(th2); t2.start(); } }
结果:
Thread-0 B0
Thread-0 B1
Thread-0 B2
Thread-0 B3
Thread-0 B4
Thread-0 B5
Thread-0 B6
Thread-0 B7
Thread-0 B8
Thread-0 B9
Thread-1 B0
Thread-1 B1
Thread-1 B2
Thread-1 B3
Thread-1 B4
Thread-1 B5
Thread-1 B6
Thread-1 B7
Thread-1 B8
Thread-1 B9
相关推荐
大家在学习java多线程的时候肯定会遇到这个...static synchronized这个是“全局锁”或者是“类锁”,该锁针对的是类,不管实例了多少个对象,线程都共享该锁。 下面我们来看代码: import java.util.concurrent.TimeUni
synchronized的几种示例研究,方法加锁,代码块加锁(this和对象)以及静态方法加锁的示例和效果。基本上包含了synchronized的几种常用的方式。
主要介绍了Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别,希望对大家有所帮助,一起跟随小编过来看看吧
public synchronized static Object getCache(String key) { return cacheMap.get(key); } /** * 判断是否存在一个缓存 * * @param key * @return */ public synchronized static boolean ...
Synchronized锁在Spring事务管理下,导致线程不安全。
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
java中synchronized用法
你还在用synchronized?线程安全相关知识深入剖析
java synchronized的一些小实验,对帮助理解synchronized的使用有一定的帮助。
如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。 无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而...
java里面synchronized用法
Synchronized关键字的用法
synchronized 测试案例,同步一个对象或者多个对象的案例均有,还有成功和失败案例的对比
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
synchronized是很重要的,但是不少人不是很明白synchronized的用法,这里有详细的doc文档给大家参考
我自己的博客所附带的案例源码,我的博客标题名称是"synchronized并发讲解",关注我等待跟多更新
Synchronized与ThreadLocal
关于synchronized的自学笔记
java语言 并发编程 ReentrantLock与synchronized区别 详解
java中synchronized的使用,java中的锁锁的到底是什么?是括号里的代码块吗?肯定不是的;