Scala中的IO操作及ArrayBuffer线程安全问题

VSole2022-07-31 10:07:22

通过Scala对文件进行读写操作在实际业务中应用也比较多,这里介绍几种常用的方式,直接上代码:

1.从文件中读取内容

object Main {
  
  def loadData(): Array[String] = {
    var bs: BufferedSource = null
    var in: InputStream = null
    try {
      in = Main.getClass.getClassLoader.getResourceAsStream("data.txt")
      if (in == null) {
        in = new FileInputStream(new File("data.txt"))
      }
      bs = new BufferedSource(in)
      bs.getLines().toArray
    } finally {
      bs.close()
    }
  }
  
  //直接通过scala.io.Source进行读取
  def testSource(): Unit = {
    Source.fromFile("data.txt").foreach(println)
  }
}

2.向文件中写内容

def write(): Unit ={
     //调用的就是java中的io类
    val writer = new PrintWriter(new File("write.txt" ))
    writer.write("scala write")
    writer.close()
}

除了读写方式,也可以从上面的“屏幕处理”上读取用户输入的指令来程序:

import scala.io. StdIn
def printIn(): Unit = {
    print("please enter number :")
    val line = StdIn.readLine()
    println(s"number is : $line")
}

相信使用 Scala 进行应用开发时,ArrayBuffer 使用该问题。但是ArrayBuffer 进行添加元素时,使用方法:+=。方法是线程安全的,如果在多线程环境中使用该方法,例如,很容索引报越界异常。

模拟多向异向定义的ArrayBuffer中插入100个元素:

def arrBuffer(): Unit = {
   //默认初始容量为16
   val arrayBuffer = new ArrayBuffer[Int]()
   val executors = Executors.newFixedThreadPool(100)
   for (i <- 1 to 100) {
     executors.execute(new Runnable {
       override def run(): Unit = {
         arrayBuffer += i
       }
     })
   }
   executors.shutdown()
 }

执行上述程序,报出类似以下的索引越界问题:

java.lang.ArrayIndexOutOfBoundsException: 32
    at scala.collection.mutable.ArrayBuffer.$plus$eq(ArrayBuffer.scala:85)
    at Main$$anonfun$main$1$$anon$1.run(Main.scala:24)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

再来看看ArrayBuffer的+=实现源码:

//初始容量
protected def initialSize: Int = 16
//array默认长度为16
protected var array: Array[AnyRef] = new Array[AnyRef](math.max(initialSize, 1))
//元素个数,默认0
protected var size0: Int = 0
  
def +=(elem: A): this.type = {
    ensureSize(size0 + 1)
    array(size0) = elem.asInstanceOf[AnyRef]
    size0 += 1
    this
}

val arrayBuffer = new ArrayBuffer[Int](初始容量为16),索引容量情况:下当array长度为1,但大小0已经大于16,并且array没有及时扩展时,会报越界。

所以,在方法环境下,要注意调用该线程时的安全问题,比如利用同步做锁处理。

这里只是以 ArrayBuffer 为例,对于 Scala 中其他的集合使用时也要注意,类似的防止出现的问题会影响程序的正常运行。

arraybufferscala
本作品采用《CC 协议》,转载必须注明作者和本文链接
通过Scala对文件进行读写操作在实际业务中应用也比较多,这里介绍几种常用的方式,直接上代码:1.从文件中读取内容object Main {. 但是ArrayBuffer 进行添加元素时,使用方法:+=。= new ArrayBuffer[Int],索引容量情况:下当array长度为1,但大小0已经大于16,并且array没有及时扩展时,会报越界。
前言Scala是以JVM为运行环境的面向对象的函数式编程语言,它可以直接访问Java类库并且与Java框架进行交互操作。正如之前所介绍,Spark是用Scala语言编写的,Kafka server端也是,那么深入学习Scala对掌握Spark、Kafka是必备掌握技能。
Headless Chrome是谷歌Chrome浏览器的无界面模式,通过命令行方式打开网页并渲染,常用于自动化测试、网站爬虫、网站截图、XSS检测等场景。
漏洞信息CVE-2021-26411 该漏洞存在于iexplore.exe mshtml.dll模块,在JS9引擎处理dom对象时,由于未对nodevalue对象的有效性做判断,所导致的UAF漏洞,该漏洞可实现RCE。
Internet Explorer 11远程执行代码漏洞 在野外发现的Internet Explorer的最新零日攻击利用了旧版JavaScript引擎中的漏洞CVE-2020-0674,CVE-2019-1429,CVE-2019-0676和CVE-2018-8653。相比之下,CVE-2020-1380是中...
CVE-2021-38001漏洞利用
2022-09-18 17:13:26
漏洞利用运行后可以看出,evil 变量被当作一个整数直接打印了,这意味着 evil 似乎变成了一个指针,能够指向任意一个对象了:DebugPrint: Smi: 0x20202021 . 但目前我们还需要有办法泄露地址,从可能让 evil 指向一个合适的目标,显然,我们目前缺少能够泄露地址的手段,但回顾其上一章曾说过的,v8 对存储的地址进行了压缩,只保留了低 32 字节,那么实际情况会是什么样的呢?
强网杯-WriteUp
2022-08-02 08:02:30
然后使用 admin/123登录管理员账户即可,登录后存在购买页面,经过测试,使用如下 payload 可以绕过检查,再访问主页面即可获得 flag
由此可以推测,之前找到的main.node,可能就是解密模块。此时找到了AES的算法常量,前两个是重复的,可能是插件问题。只能去问度娘了,搜索一下AES加密解密原理与 C 实现代码。
在上周末的深育杯线上赛中,遇到了一个挺有意思的题目,叫 HelloJerry,考察的是 JerryScript 引擎的漏洞利用。
跟随P4nda大佬的博客复现了CVE-2018-17463,在一些大佬懒得讲的地方加了一些理解和解释,比较新手向。
VSole
网络安全专家