首先来简单介绍一下static和synchronized这两个属性;
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
synchronized:在java中是同步的意思。是内置语言级的同步原语,这也大大简化了Java中多线程同步的使用。
第一种实例:
public class TestSync implements Runnable { Sync s = new Sync(); public static void main(String[] args) { Thread t1 = new Thread(new TestSync()); Thread t2 = new Thread(new TestSync()); t1.start(); t2.start(); } // 重写run方法 public void run() { s.add(); } } class Sync { static int num; public synchronized void add() { try { num++; } catch (Exception e) { System.out.println("抱歉!当前线程执行到这里中断了。"); } System.out.println("当前是第" + num + "个线程执行到这里"); } }
在这个实例里面的第15行我使用了 static 。这样输出结果为:
当前是第1个线程执行到这里 当前是第2个线程执行到这里
虽然这样输出的结果是正确的。但是同步锁并没有起到作用。因为Sync 是两个不同 实例。它没有被共用。虽然num被共用到。一旦在Sync 里面加上线程等待sleep或wait,这样输出的结果就会是两个相同或者多个相同的 结果。这样是非常不安全的。
如:
public class TestSync implements Runnable { Sync s = new Sync(); public static void main(String[] args) { // Thread t2 = new Thread(new TestSync()); for (int i = 0; i <10; i++) { Thread t1 = new Thread(new TestSync()); t1.start(); } // t2.start(); } // 重写run方法 public void run() { s.add(); } } class Sync { static int num; public synchronized void add() { try { num++; Thread.sleep(10); } catch (Exception e) { System.out.println("抱歉!当前线程执行到这里中断了。"); } System.out.println("当前是第" + num + "个线程执行到这里"); } }
当前是第10个线程执行到这里 当前是第10个线程执行到这里 当前是第10个线程执行到这里 当前是第10个线程执行到这里 当前是第10个线程执行到这里 当前是第10个线程执行到这里 当前是第10个线程执行到这里 当前是第10个线程执行到这里 当前是第10个线程执行到这里 当前是第10个线程执行到这里
正确用法是在Sync 实例前加上static。实现共用:
public class TestSync implements Runnable { static Sync s = new Sync(); public static void main(String[] args) { // Thread t2 = new Thread(new TestSync()); for (int i = 0; i <10; i++) { Thread t1 = new Thread(new TestSync()); t1.start(); } // t2.start(); } // 重写run方法 public void run() { s.add(); } } class Sync { int num; public synchronized void add() { try { num++; Thread.sleep(10); } catch (Exception e) { System.out.println("抱歉!当前线程执行到这里中断了。"); } System.out.println("当前是第" + num + "个线程执行到这里"); } }
当前是第1个线程执行到这里 当前是第2个线程执行到这里 当前是第3个线程执行到这里 当前是第4个线程执行到这里 当前是第5个线程执行到这里 当前是第6个线程执行到这里 当前是第7个线程执行到这里 当前是第8个线程执行到这里 当前是第9个线程执行到这里 当前是第10个线程执行到这里
本文出自 “总结” 博客,请务必保留此出处http://5462361.blog.51cto.com/5452361/1390576
java static 与 线程 共用同步问题,布布扣,bubuko.com
原文:http://5462361.blog.51cto.com/5452361/1390576