zoukankan      html  css  js  c++  java
  • 当synchronized关键字和this关键字

    package cn.itcast_01_mythread.thread.testThread;
    
    
    public class MyThreadWithImpliment_Synch_method implements Runnable {
        int x;
    
        public MyThreadWithImpliment_Synch_method(int x) {
            this.x = x;
        }
    
        
        public synchronized void queryCurrentTime(){        
            for (int i = 0; i < 10; i++) {
                String name = Thread.currentThread().getName();
                System.out.println("to "+name + " current is " + i);
                /*try {
                    //Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }*/
            }
            
        }
        
        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            System.out.println("线程" + name + "的run方法被调用……");
            this.queryCurrentTime();
    //queryCurrentTime();
        }
    
        public static void main(String[] args) {
            Thread thread1 = new Thread(new MyThreadWithImpliment_Synch_method(1), "thread-1");
            Thread thread2 = new Thread(new MyThreadWithImpliment_Synch_method(2), "thread-2");
             thread1.start();
             thread2.start();
            // 注意调用run和调用start的区别,直接调用run,则都运行在main线程中
    //        thread1.run();
    //        thread2.run();
        }
    }

    this.queryCurrentTime();//执行的结果,结果与预期的一样

    线程thread-2的run方法被调用……
    to thread-2 current is 0
    to thread-2 current is 1
    to thread-2 current is 2
    to thread-2 current is 3
    to thread-2 current is 4
    to thread-2 current is 5
    to thread-2 current is 6
    to thread-2 current is 7
    to thread-2 current is 8
    to thread-2 current is 9
    线程thread-1的run方法被调用……
    to thread-1 current is 0
    to thread-1 current is 1
    to thread-1 current is 2
    to thread-1 current is 3
    to thread-1 current is 4
    to thread-1 current is 5
    to thread-1 current is 6
    to thread-1 current is 7
    to thread-1 current is 8
    to thread-1 current is 9

    queryCurrentTime();//执行的结果 与预期的不一样!!,好像就没有实现锁的功能

    线程thread-1的run方法被调用……
    线程thread-2的run方法被调用……
    to thread-1 current is 0
    to thread-2 current is 0
    to thread-1 current is 1
    to thread-2 current is 1
    to thread-1 current is 2
    to thread-2 current is 2
    to thread-1 current is 3
    to thread-2 current is 3
    to thread-1 current is 4
    to thread-2 current is 4
    to thread-1 current is 5
    to thread-2 current is 5
    to thread-1 current is 6
    to thread-2 current is 6
    to thread-1 current is 7
    to thread-2 current is 7
    to thread-1 current is 8
    to thread-2 current is 8
    to thread-1 current is 9
    to thread-2 current is 9

    看疯狂java上说的,对于synchronized修饰的实例方法(非static方法)而言,无须显示指定同步监视器,同步方法监视器是this也就是调用该方法的对象。

    所以我的理解是对于synchronized是站在对象的级别的,不是站在方法的级别的,如果直接在同一个类不通过this关键字调这个方法那么同步锁就没有加上同时代码不会报任何错误

    synchronized和lock都是多线程的时候调用的,如果在javaweb中使用这些,而线程是有容器(tomcat)产生的不是我们自己产生的,这中做法很难测试,比如单例模式

    比较好的做法是在我们自己写代码的时候结合业务需要建立多线程,然后用synchronized或lock 

    ps:用的是jdk1.8

  • 相关阅读:
    sql server 2000 “因为选定的用户拥有对象,所以无法除去该用户。”问题(含图说明)
    关于datalength函数,解决ntext等无法比较空值的问题
    Analysis service的manager无法连接,不能连接服务器(xxxxx)注册表,或者还不是olap Administrator组成员
    数据库查询问题int型字段对应以Int型数值+','组成的nvarchar型字段
    Asp与Asp.net共用cookie
    什么是SPSS
    TransactSQL语言提供的日期和时间函数(以备后用)
    关于sql语句的执行效率测试
    sqlserver数据仓库学习第一课(含资料)
    理解collate Chinese_PRC_CI_AS NULL
  • 原文地址:https://www.cnblogs.com/rocky-AGE-24/p/6853660.html
Copyright © 2011-2022 走看看