很多时候我们查看博客发现synchronized 用于线程的同步但,实际用时却出了问题 如下:
- public class TestThread implements Runnable{
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- for(int i = 0; i < 3; i++){
- Thread thread = new Thread(new TestThread());
- thread.setName(""+ i);
- thread.start();
- }
- }
- public TestThread() {
- // TODO Auto-generated constructor stub
- }
-
- public void run(){
- Timer timer = new Timer();
- timer.test(Thread.currentThread().getName());
- }
- }
- class Timer{
- public synchronized void test(String str) {
- // synchronized(this){
- System.out.println( Thread.currentThread().getName() + '\t' + "test开始..");
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println( Thread.currentThread().getName() + '\t' + "test结束..");
- }
- // }
- }
复制代码
输出的结果:
1 test开始..
2 test开始..
0 test开始..
0 test结束..
1 test结束..
2 test结束..
这里不禁要范文,这个到底是哪里出了错误,原因在于:对于非static代码,synchronized锁住的是括号里的对象,对于static代码,锁住的是实例本身。 要想在非static代码中起到同步作用就应该在代码中加入该对象实例
- public void test() {
- synchronized (Sync.class) {
- System.out.println(Thread.currentThread().getName() + '\t' + "test开始..");
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName() + '\t' + "test结束..");
- }
- }
复制代码
//这样就实现同步了(由于博客有字数限制所以只能尽量把主要代码罗列)
我对synchronized关键字了解只限于此,希望看了不解的网络提出问题 |
|