精华内容
下载资源
问答
  • 论文研究-协同资源交互的神经网络模型仿真.pdf, 首先根据资源在商业网络参与者之间交互的特性,将企业资源分为协同资源和协同资源;然后,在分析协同资源...
  • 当处理大型的系统项目,或者保密要求高的项目。是要解除一些加密算法的,对称加密肯定比对称加密更加安全,但是也更消耗性能。这里就展示一下前端使用Vue,后端使用Spring boot的情况下,进行前后端交互的情况。...

    当处理大型的系统项目,或者保密性要求高的项目。是要解除一些加密算法的,非对称加密肯定比对称加密更加安全,但是也更消耗性能。这里就展示一下前端使用Vue,后端使用Spring boot的情况下,进行前后端交互的情况。

    前端

    安装加密插件

    cnpm install jsencrypt --save

    在main.js中全局绑定加密方法,全局设置公匙

    import { JSEncrypt } from 'jsencrypt'
    
    
    
    Vue.prototype.$encryptByPublicKey=function(content) {
      let encrypt=new JSEncrypt();
      encrypt.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCH6+puCfJfAWLwIeAqvffe4Hpdr+2W7CI9p5dgsLhtXKvPx+LWAuyTGspwNlQ9DpBTvQEpgnFXkiUGO9DwElJgekAG7Eb3RGN92WQX2BpzvbnZrDYVZT9bTxkNfUABc2zkSG278ndC6e1/gyrkx7rGkLvlHvZwKxy9YPYJL44sBwIDAQAB")
      return encrypt.encrypt(content);
    };

    测试代码,加密一个字符串,在新窗口打开,传递到后端

     let data = this.$encryptByPublicKey("14d0b282059a4d52b54deb924cabf9d5");
          data=encodeURIComponent(data);
          window.open("http://localhost:18002/ossserver/api/v1/material/file/secret?key="+data);

    后端

    RSA工具类,加密、解密、生成公匙密匙、签名、验证

    package com.grandtech.oss.common;
    
    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.Cipher;
    import java.security.*;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;
    import java.util.Map;
    
    public class RSACoder {
      public static final String KEY_ALGORITHM = "RSA";
      public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
    
      private static final String PUBLIC_KEY = "RSAPublicKey";
      private static final String PRIVATE_KEY = "RSAPrivateKey";
    
      public static byte[] decryptBASE64(String key) {
        return Base64.decodeBase64(key);
      }
    
      public static String encryptBASE64(byte[] bytes) {
        return Base64.encodeBase64String(bytes);
      }
    
      /**
       * 用私钥对信息生成数字签名
       *
       * @param data       加密数据
       * @param privateKey 私钥
       * @return
       * @throws Exception
       */
      public static String sign(byte[] data, String privateKey) throws Exception {
        // 解密由base64编码的私钥
        byte[] keyBytes = decryptBASE64(privateKey);
        // 构造PKCS8EncodedKeySpec对象
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        // KEY_ALGORITHM 指定的加密算法
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        // 取私钥匙对象
        PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // 用私钥对信息生成数字签名
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initSign(priKey);
        signature.update(data);
        return encryptBASE64(signature.sign());
      }
    
      public static PrivateKey strToPrivateKey(String privateKey) throws Exception {
        // 解密由base64编码的私钥
        byte[] keyBytes = decryptBASE64(privateKey);
        // 构造PKCS8EncodedKeySpec对象
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        // KEY_ALGORITHM 指定的加密算法
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        // 取私钥匙对象
        return keyFactory.generatePrivate(pkcs8KeySpec);
      }
    
      /**
       * 校验数字签名
       *
       * @param data      加密数据
       * @param publicKey 公钥
       * @param sign      数字签名
       * @return 校验成功返回true 失败返回false
       * @throws Exception
       */
      public static boolean verify(byte[] data, String publicKey, String sign)
          throws Exception {
        // 解密由base64编码的公钥
        byte[] keyBytes = decryptBASE64(publicKey);
        // 构造X509EncodedKeySpec对象
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        // KEY_ALGORITHM 指定的加密算法
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        // 取公钥匙对象
        PublicKey pubKey = keyFactory.generatePublic(keySpec);
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initVerify(pubKey);
        signature.update(data);
        // 验证签名是否正常
        return signature.verify(decryptBASE64(sign));
      }
    
      public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception{
        // 对密钥解密
        byte[] keyBytes = decryptBASE64(key);
        // 取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // 对数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(data);
      }
    
      /**
       * 解密<br>
       * 用私钥解密
       *
       * @param data
       * @param key
       * @return
       * @throws Exception
       */
      public static byte[] decryptByPrivateKey(String data, String key)
          throws Exception {
        return decryptByPrivateKey(decryptBASE64(data),key);
      }
    
      /**
       * 解密<br>
       * 用公钥解密
       *
       * @param data
       * @param key
       * @return
       * @throws Exception
       */
      public static byte[] decryptByPublicKey(byte[] data, String key)
          throws Exception {
        // 对密钥解密
        byte[] keyBytes = decryptBASE64(key);
        // 取得公钥
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key publicKey = keyFactory.generatePublic(x509KeySpec);
        // 对数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        return cipher.doFinal(data);
      }
    
      /**
       * 加密<br>
       * 用公钥加密
       *
       * @param data
       * @param key
       * @return
       * @throws Exception
       */
      public static byte[] encryptByPublicKey(String data, String key)
          throws Exception {
        // 对公钥解密
        byte[] keyBytes = decryptBASE64(key);
        // 取得公钥
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key publicKey = keyFactory.generatePublic(x509KeySpec);
        // 对数据加密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data.getBytes());
      }
    
      /**
       * 加密<br>
       * 用私钥加密
       *
       * @param data
       * @param key
       * @return
       * @throws Exception
       */
      public static byte[] encryptByPrivateKey(byte[] data, String key)
          throws Exception {
        // 对密钥解密
        byte[] keyBytes = decryptBASE64(key);
        // 取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // 对数据加密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        return cipher.doFinal(data);
      }
    
      /**
       * 取得私钥
       *
       * @param keyMap
       * @return
       * @throws Exception
       */
      public static String getPrivateKey(Map<String, Key> keyMap)
          throws Exception {
        Key key = (Key) keyMap.get(PRIVATE_KEY);
        return encryptBASE64(key.getEncoded());
      }
    
      /**
       * 取得公钥
       *
       * @param keyMap
       * @return
       * @throws Exception
       */
      public static String getPublicKey(Map<String, Key> keyMap)
          throws Exception {
        Key key = keyMap.get(PUBLIC_KEY);
        return encryptBASE64(key.getEncoded());
      }
    
      /**
       * 初始化密钥
       *
       * @return
       * @throws Exception
       */
      public static Map<String, Key> initKey() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGen = KeyPairGenerator
            .getInstance(KEY_ALGORITHM);
        keyPairGen.initialize(1024);
        KeyPair keyPair = keyPairGen.generateKeyPair();
        Map<String, Key> keyMap = new HashMap(2);
    
    
        keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公钥
        keyMap.put(PRIVATE_KEY, keyPair.getPrivate());// 私钥
        return keyMap;
      }
    
    }
    

    生成公匙密匙

      @Test
      public void initKey() {
        try {
          Map<String, Key> keyMap= RSACoder.initKey();
          System.out.println(RSACoder.getPrivateKey(keyMap));
          System.out.println(RSACoder.getPublicKey(keyMap));
        } catch (NoSuchAlgorithmException e) {
          e.printStackTrace();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }

    接口接收传进来的加密后的参数,并解密

      @GetMapping("/file/secret")
      private ResponseEntity<Resource> downFiles(HttpServletRequest request, HttpServletResponse response) {
        String privateKey="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIfr6m4J8l8BYvAh4Cq9997gel2v7ZbsIj2nl2CwuG1cq8/H4tYC7JMaynA2VD0OkFO9ASmCcVeSJQY70PASUmB6QAbsRvdEY33ZZBfYGnO9udmsNhVlP1tPGQ19QAFzbORIbbvyd0Lp7X+DKuTHusaQu+Ue9nArHL1g9gkvjiwHAgMBAAECgYBUBDHOfvuAWl0LzgTApthWvi8lRh/4kFHCBpv9un7lqsjREN9YJkqRy5eisRJ1A1GXUVcsj2L8HGwiZEsMembML7ifPReXVYieXPCOIFuPZWwmlBWh3imeU2YvCrvMjG3wQIIlGpWpqjdPX683DYxUF2wAxSRupZ98lvEctU+1oQJBANKFSUSD8Sz9zXKL9xbn24XHshMvWNIkxONtvyJh8Vf3omFEWPtlw6ekSQSAmOhpk6CLyAq5QMtGdHGWZTA+8K8CQQClSPjyLJSwQHfiMZQ66WrNCWXETOhoT9t10KA2BRVmyFQMrxU0zecmrTORpSKTjRjHAoyfUm6rXbI9QY/2SGApAkEAna0S6WxhcS9Pd6H5mYBjXVnquI/X2N2NUkJazCfLmfVx+6QzeWgJGUDlJ6gh3sFkvvSzCcUjEJ1ejcz1USNzJQJAZJPrKTMHp9kTGomg8dhoLSyyyKkkI5W0rhSt6TFevJTa0H0aIm/JYTe0UcRzLeaGVVOvzqOSxKTXeX8T44JXQQJAdvTiEX9a9mvOC8J3893bENv5pfpCOMQKsjyHeMxoS7wJ6rxwoH0KYNWrycYGmpBEcZUgcz8RQ+oeaLDFicudEw==";
        String id= null;
        try {
          String key=request.getParameter("key");
          id = new String(RSACoder.decryptByPrivateKey(key,privateKey));
        } catch (Exception e) {
          e.printStackTrace();
          return null;
        }

    正常运行前端代码,后端解密正常

    RSA并不适合大量数据的加密

    展开全文
  • 针对电子调查存在的不少安全问题,如信息欺骗、隐私安全等,构建了一个基于非交互零知识证明(NIZK,...最后,对系统的功能进行了仿真并验证,结果表明,系统能够正确完成各项功能,并有效地保证系统的匿名性与真实性。
  • 一个非交互不可展承诺方案其安全基于格 上 困 难 问 题实现了承诺者绑定性 它 基 于 抗 碰 撞 函 数 的<br /> 安全对承诺合法进行验证通过随机映射扰动明文使明文具有随机分布特性以实现验证者隐藏...
  • Android开发之Webview中原生JS交互

    千次阅读 2018-10-14 21:45:50
    文章目录概述使用场景交互方式Java调用JS代码JS调用Java代码总结 ...交互场景 计算密集型场景 对UI复杂度要求不高的场景 以上可见,《王者荣耀》断然不会使用混合开发的,其实谷歌举了两个最适合的...

    概述

    由于手机硬件资源的快速提升,使得采用混合开发的可能性逐渐成为现实并且流行起来。Android开发中最为简单的方式就是通过Webview来嵌入一个网页使web作为App的一部分。

    使用场景

    1. 非重交互场景
    2. 非计算密集型场景
    3. 对UI复杂度要求不高的场景
      以上可见,《王者荣耀》断然不会使用混合开发的,其实谷歌举了两个最适合的场景:
      第一:内容需要动态更新的场景,例如APP里面的法律条款展示等。
      第二:总是需要通过网络来拉取展示内容的场景,例如新闻展示。

    交互方式

    我们知道,网页的行为现在是使用JavaScript来处理的,而Android原生使用的是Java(Kotlin),交互的意思即原生可以调用JavaScript方法,而JavaScript也可以调用原生的方法。

    Java调用JS代码的方法有2种:

    1. 通过WebView的loadUrl() 方法
    2. 通过WebView的evaluateJavascript()方法

    JS调用Java代码的方法有3种:

    1. 通过WebView的addJavascriptInterface()进行对象映射
    2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
    3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

    先上一张效果图:
    在这里插入图片描述

    Java调用JS代码

    上面提到Android提供了两种方法来实现Java执行Js代码,其中evaluateJavascript()方法是从 API 19(4.4版本)开始提供的,而现在Android已经发布到 API 28 (9.0)了, 4.4以下版本占的比例已经非常少了,相信过不了多久基本上就不存在了,所以我们要放下历史包袱,直接使用新的方法。最重要的是,在Android 4.4及其以上版本Google 采用了 Chromium(http://www.chromium.org/) 作为系统WebView的底层内核,而不是WebKit了。新的webview对HTML5,CSS3,Javascript的支持更为广泛,而且js执行引擎直接换成了V8,执行效率大大提升.

    void evaluateJavascript(String script, ValueCallback<String> resultCallback){}
    

    参数script : 要执行的JS代码。
    参数 resultCallback: Js代码执行后的返回值

    具体步骤:
    第一:新建一个工程,新建一个Activity,包含一个Webview控件。
    第二:新建一个demo.html的文档,作为要在webview中展示的web页面,里面含有js代码。将其放在工程中的assets文件家中。

    <!DOCTYPE html>
    <html>
    <head lang="zh-cmn-Hans">
        <meta charset="UTF-8">
        <meta name="renderer" content="webkit">
        <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
        <meta name="viewport" content="width=device-width"/>
        <title>JsBridgeDemo</title>
    </head>
    <style>
        .btn {
            text-align: center;
            background: #d8d8d8;
            color: #222;
            padding: 20px;
            margin: 30px;
            font-size: 24px;
            border-radius: 4px;
            box-shadow: 4px 2px 10px #999;
        }
    
        .btn:active {
            opacity: .7;
            box-shadow: 4px 2px 10px #555;
        }
    </style>
    
    <body>
    <div class="btn" onclick="showAndroidToast('Js调用Java')">Js调用Java函数</div>
    <p id="content"></p>
    
    <script type="text/javascript">
        function showAndroidToast(toast) {
            android.showToast(toast);
        }
    
       function fillContent(){
          document.getElementById("content").innerHTML ="此处内容由Java调用Js方法展示在Webview上";
          return "ok";
       }
    </script>
    </body>
    

    第三步:在activity中通过webview调用Js代码。

      final WebView myWebView=findViewById(R.id.webView);
      WebSettings webSettings=myWebView.getSettings();
      webSettings.setJavaScriptEnabled(true);
      myWebView.loadUrl("file:///android_asset/demo.html");
      Button btnCallJs=findViewById(R.id.btn_call_js);
      btnCallJs.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              myWebView.evaluateJavascript("fillContent()", new ValueCallback<String>() {
                  @Override
                  public void onReceiveValue(String value) {
                      Toast.makeText(MainActivity.this,value,Toast.LENGTH_SHORT).show();
                  }
              });
          }
      });        
    

    首先设置允许Webview执行Js,然后加载assets文件夹中的demo.html网页,最后在点击按钮的时候使用evaluateJavascript()方法来执行Js代码。

    JS代码的调用需要在web页面加载完成后才可以正常执行。可以通过监听WebViewClient的onPageFinished 回调来完成,如下代码所示。

     myWebView.setWebViewClient(new WebViewClient(){
              @Override
              public void onPageFinished(WebView view, String url){
                  super.onPageFinished(view, url);
                  //执行Js代码
              }
          });
    

    JS调用Java代码

    上面提到有三种方法可以实现Js调用Java代码的目的,其中第一种简单明了,为Google推荐的方法,但是其在API 17(4.2)之前存在任意执行漏洞。但是我们前面分析了,4.4 都快没有了,4.2 就更别说了,所以我们直接针对Android4.4编程,使用这个方法是安全的。

    具体步骤:
    第一步:新建一个接口类JavaInterface ,里面定义给Js调用的方法。这些方法必须是public的,而且必须使用@JavascriptInterface进行注解,例如下面的代码示例中的showTost()

    public class JavaInterface {
        private Context mContext;
    
        JavaInterface(Context c) {
            mContext = c;
        }
    
        @JavascriptInterface
        public void showToast(String toast) {
            Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        }
    }
    

    第二步:给Webview添加与Js的映射关系

    myWebView.addJavascriptInterface(new JavaInterface(this),"android");
    

    参数1:接口类的对象
    参数2:Java对象映射到Js的对象名,可以在Js中使用这个对象来调用接口类中的方法。

    第三步:在Js中调用Java方法

    <script type="text/javascript">
        function showAndroidToast(toast) {
            android.showToast(toast);
        }
    </script>
    

    可以看到,在js中可以使用android这个Js对象,直接调用我们定义在JavaInterface类中的方法。

    总结

    以上就是Android开发中使用Webview 完成原生与web的交互。开篇说道除了本文介绍的方式,还有其他几种方式,大部分不是有历史包袱就是本意不是用来做这件事情的,所以应该优先使用本文的方式,如果有的同学需要了解其他方法,可以参考这篇博客,写的比较全。

    如果是在项目中使用而不是为了学习,推荐使用前人写好的三方库,例如DSBridge,JsBridge等。特别是dsbridge,三端全有,现代简洁,易用。

    展开全文
  • 区块在几秒钟内完成,Algorand的交易吞吐量可大型支付和金融网络相提并论。 Algorand是第一个提供即时交易确定的区块链。 不分叉没有不确定。 介绍 Algorand-php是一个社区SDK,它采用一种优雅的方法将您的...
  • React式API,支持阻塞数据库驱动程序以及数据库交互的React式。 Hibernate Reactive可以在任何普通Java程序中使用,但特别针对和等React式环境中的使用。 当前支持 , 和 。 要了解更多信息,访问 。 兼容 ...
  • 为有效应对多方案DEMATEL在实际决策情景中涌现的个体选择偏好、流程导向偏好与交互学习偏好三者交互与融合问题,针对现有单方案方法在构造直接判断矩阵过程中忽视专家整体偏好一致的不足,解析决策过程中三类偏好...
  • 我们显示了任意自旋的最小耦合物质场基于Ricci的引力理论耦合时如何发展平凡的有效相互作用,这些相互作用只能在特征高能尺度以下才能被扰动地对待。$$ \ Lambda _ {Q} $$ QQ。 然后,我们使用这种交互作用来...
  • 同样的,java内存中线程的工作内存和主内存的交互是由java虚拟机定义了如下的8种操作来完成的,每种操作必须是原子的(double和long类型在某些平台有例外,参考volatile详解和原子协定) java虚拟机中主内存和...

    物理机高速缓存和主内存之间的交互有协议,同样的,java内存中线程的工作内存和主内存的交互是由java虚拟机定义了如下的8种操作来完成的,每种操作必须是原子性的(double和long类型在某些平台有例外,参考volatile详解和非原子性协定)
    java虚拟机中主内存和工作内存交互,就是一个变量如何从主内存传输到工作内存中,如何把修改后的变量从工作内存同步回主内存。

    lock(锁定):作用于主内存的变量,一个变量在同一时间只能一个线程锁定,该操作表示这条线成独占这个变量
    unlock(解锁):作用于主内存的变量,表示这个变量的状态由处于锁定状态被释放,这样其他线程才能对该变量进行锁定
    read(读取):作用于主内存变量,表示把一个主内存变量的值传输到线程的工作内存,以便随后的load操作使用
    load(载入):作用于线程的工作内存的变量,表示把read操作从主内存中读取的变量的值放到工作内存的变量副本中(副本是相对于主内存的变量而言的)
    use(使用):作用于线程的工作内存中的变量,表示把工作内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时就会执行该操作
    assign(赋值):作用于线程的工作内存的变量,表示把执行引擎返回的结果赋值给工作内存中的变量,每当虚拟机遇到一个给变量赋值的字节码指令时就会执行该操作
    store(存储):作用于线程的工作内存中的变量,把工作内存中的一个变量的值传递给主内存,以便随后的write操作使用
    write(写入):作用于主内存的变量,把store操作从工作内存中得到的变量的值放入主内存的变量中
    如果要把一个变量从主内存传输到工作内存,那就要顺序的执行read和load操作,如果要把一个变量从工作内存回写到主内存,就要顺序的执行store和write操作。对于普通变量,虚拟机只是要求顺序的执行,并没有要求连续的执行,所以如下也是正确的。对于两个线程,分别从主内存中读取变量a和b的值,并不一样要read a; load a; read b; load b; 也会出现如下执行顺序:read a; read b; load b; load a; (也就是程序乱序),对于这8中操作,虚拟机也规定了一系列规则,在执行这8中操作的时候必须遵循如下的规则:

    不允许read和load、store和write操作之一单独出现,也就是不允许从主内存读取了变量的值但是工作内存不接收的情况,或者不允许从工作内存将变量的值回写到主内存但是主内存不接收的情况
    不允许一个线程丢弃最近的assign操作,也就是不允许线程在自己的工作线程中修改了变量的值却不同步/回写到主内存
    不允许一个线程回写没有修改的变量到主内存,也就是如果线程工作内存中变量没有发生过任何assign操作,是不允许将该变量的值回写到主内存就是任何值一定要改变之后才会写回主存。
    变量只能在主内存中产生,不允许在工作内存中直接使用一个未被初始化的变量,也就是没有执行load或者assign操作。也就是说在执行use、store之前必须对相同的变量执行了load、assign操作
    一个变量在同一时刻只能被一个线程对其进行lock操作,也就是说一个线程一旦对一个变量加锁后,在该线程没有释放掉锁之前,其他线程是不能对其加锁的,但是同一个线程对一个变量加锁后,可以继续加锁,同时在释放锁的时候释放锁次数必须和加锁次数相同。
    对变量执行lock操作,就会清空工作空间该变量的值,执行引擎使用这个变量之前,需要重新load或者assign操作初始化变量的值
    不允许对没有lock的变量执行unlock操作,如果一个变量没有被lock操作,那也不能对其执行unlock操作,当然一个线程也不能对被其他线程lock的变量执行unlock操作
    对一个变量执行unlock之前,必须先把变量同步回主内存中,也就是执行store和write操作
    当然,最重要的还是如开始所说,这8个动作必须是原子的,不可分割的。

    针对volatile修饰的变量,会有一些特殊规定。

    展开全文
  • 3GWLAN交互网络结构

    2020-03-04 11:51:02
    3G网络工作在规定的无线频率频段,而WLAN网络工作在无线频率许可频段,会产生不协调干扰,进而减少无线接入的覆盖范围。WLAN网络以高性能价格比用于用户业务需求猛增的热点区,WLAN网络的小覆盖区域能力不能提供3G...
  • 我们在性能测试监控MYSQL数据库时,作为专业功能测试人员,我们需要了解操作系统工作原理、业务实现架构逻辑、应用架构实现逻辑、数据库工作原理,才能真正的做好功能测试,而大部分业务型交易问题都是因为...

    我们在性能测试监控MYSQL数据库时,作为专业非功能性测试人员,我们需要了解操作系统工作原理、业务实现架构逻辑、应用架构实现逻辑、数据库工作原理,才能真正的做好非功能性测试,而大部分业务型交易问题都是因为数据库问题原因产生的性能瓶颈,而更多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,也就是实际前端业务操作到从磁盘捞取数据整个实现过程如果运作,了解了这些,明白查询优化是遵循MySQL优化器方式运行,具体如下图:

    MYSQL数据交互原理与性能问题分析
    根据上图所示我们了解到,无论是手机端还是PC端,例如我们点餐系统,通过APP客户端,我们查询要点的餐饮,这时通过网络连接同数据库服务层建立TCP连接。

    读写数据方式
    1、步骤一与数据库连接建立:
    连接管理模块会建立连接,并请求一个连接线程。如果连接池中有空闲的连接线程,则分配给这个连接,如果没有,在没有超过最大连接数的情况下,创建新的连接线程负责这个客户端。

    2、步骤二检查语法
    接下来验证用户是否有权限。例如你有注册,查看该用户是会员用户,方可提供点餐服务,连接线程开始接收并处理来自客户端的SQL语句。连接线程接收到SQL语句之后,将语句交给SQL语句解析模块进行语法分析和语义分析。

    3、步骤三检查缓存
    如果是查询语句,则可以先看查询缓存中是否有结果,如果有结果可以直接返回给客户端。

    4、步骤四检查引擎优化
    如果查询缓存中没有结果,就需要真的查询数据库引擎层了,于是发给SQL优化器,进行查询的优化。就是请求数据库引擎层,打开表,接下来的处理过程就到了数据库引擎层,例如InnoDB。

    5、步骤五,数据读取方式
    在数据库引擎层,要先查询缓存是否有数据,如果有直接返回,如果没有就要从磁盘上去读取,把磁盘中找到相应的数据加载到缓存中,下次读取直接从缓存读取从而使得后面的查询更加高效。

    6、步骤六,关闭连接
    获取数据后返回给客户端,关闭连接,释放连接线程,过程结束。

    性能问题分析:
    如果语法写的有问题,则在从磁盘捞取数据时会出现磁盘IO高或者CPU高,那就是语法写法问题或者索引使用问题,如果语法分析没问题,则看缓存页配置是否太小了,或者本身物理内存就小,给缓存的空间就少了。

    转载于:https://blog.51cto.com/372550/2395431

    展开全文
  • 课件平台交互机制

    2007-05-09 09:11:00
    有很多标准的课件,它们是不需要平台交互的,下载就可以用。而SCORM课件是平台依赖的,没有平台就不能播放。由于必须有平台做支持,因此没有授权的用户是不能观看的,这样课件的知识产权就得到了保护,课件...
  • 本文实例简述了C#实现窗体...一般来说窗体上的UI在默认情况下不允许使用子线程(或者其它创建控件的UI线程)去控制(这在NET2.0以下是允许的,但是考虑到安全等问题,从2.0开始就禁止使用这个功能,除非Form的...
  • 一个易于使用的,无阻塞的Scala客户端库,用于进行交互。 请参阅以获取完整的,, 等。 状态(2015年1月24日) 最新版本是0.9.5, 2.3.9和 1.3.2兼容。 已针对Riak 2.0.4进行了兼容测试。 该库是针对Scala...
  • 通过建立理论模型及270份中国企业的调研数据,就内部资源、能力和外部网络对创新的交互机制进行了探讨,发现企业内部研发能力、技术冗余资源以及不同的外部网络联系之间的交互作用,对财务绩效、创新绩效会产生不同...
  • 当谈到网站的视觉设计这个问题时有两种截然相反的观点 一可用倡导者们一直认为网站要便于使用而漂亮 jakob nielsen认为几乎所有为实现视觉效果而做的事情都会对 可用产生妨碍 不过在过去几年可用倡导者们的...
  • 1.mongodb的官方文档 ...2.可扩展差,大数据下IO压力大,表结构更改困难 关系型 1.易扩展 2.大数据量,高性能 3.数据模型灵活,⽆需事先为要存储的数据建⽴字段, 随时可以存储⾃定义的数据格式 3.mongodb和pyth...
  • app客户端服务器数据交互时—数据加密2015年06月14日 19:49:28阅读数:5884总结(1)、对称加密加密解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全不高(2)、对称加密使用了一对...
  • 有很多标准的课件,它们是不需要平台交互的,下载就可以用。而SCORM课件是平台依赖的,没有平台就不能播放。由于必须有平台做支持,因此没有授权的用户是不能观看的,这样课件的知识产权就得到了保护,...
  • * 本作品采用知识共享署名-商业使用 2.5 中国大陆许可协议进行许可 专业交流 模板超市 设计服务 本作品的提供是以适用知识共享组织的公共许可 简称CCPL 或 许可 条款为前提的本作品受著作权法以及其他相关法律...
  • 窗体子线程的交互

    2014-07-31 13:45:00
    窗体上的UI默认情况下不允许使用子线程(或者其它创建控件的UI线程)去控制(这在NET2.0以下是允许的,但是考虑到安全等问题,从2.0开始就禁止使用这个功能,除非Form的CheckForIllegalCrossThreadCalls=true,...
  • OpenTherm Gateway交互的python库 有关硬件,请参见 。 该库主要用于家庭助理( )一起使用,但也可以用于其他目的。由于我的恒温器和锅炉不支持所有OpenTherm功能,因此部分代码尚未经过全面测试。随时进行测试...
  • NET交互操作服务

    2010-10-05 01:42:00
    Microsoft .NET最核心的特征是交互性,包括多种程序语言的交互、与非托管代码的交互。其中与非托管代码又包括与现有原生代码(Native code)的交互、与COM的互相交互操作。与非托管代码交互使得.NET能够与操作...
  • * 本作品采用知识共享署名-商业使用 2.5 中国大陆许可协议进行许可 专业交流 模板超市 设计服务 本作品的提供是以适用知识共享组织的公共许可 简称CCPL 或 许可 条款为前提的本作品受著作权法以及其他相关法律...
  • 可以选择这些线以创建磁通管,并进一步填充用户定义的分析热/热粒子分布模型。 默认情况下,该应用程序集成IDL可调用DLL和共享库,这些库包含基于FORTRAN和C ++开发的快速GS发射代码,该代码基于新开发的...
  • .NET交互操作服务

    2009-01-05 20:46:00
    .NET交互操作服务 前言.NET是微软最新推出的编程平台,它通过...Microsoft .NET最核心的特征是交互性,包括多种程序语言的交互、与非托管代码的交互。其中与非托管代码又包括与现有原生代码(Native code)的交互、与
  • 2013-07-29 09:51:10 缘,妙不可言 清润老师,我现在要做 SOA服务治理的 建模,但是这个 基本不是企业应用,... 非交互密集型 2013-07-29 10:04:59 青润 这些一般属于非功能需求。是需要技术人员根据系...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,569
精华内容 627
关键字:

交互性与非交互性