小编Luk*_*uke的帖子

Java同步无法按预期工作

我有一个"简单"的4类示例,可以在多台计算机上可靠地显示java同步的意外行为.正如你可以在下面看到的那样,给定java sychronized关键字的契约,Broke Synchronization永远不应该从类TestBuffer中打印出来.

以下是将重现问题的4个类(至少对我而言).我对如何修复这个破碎的例子并不感兴趣,而是为什么它首先打破了.

同步问题 - Controller.java

同步问题 - SyncTest.java

同步问题 - TestBuffer.java

同步问题 - Tuple3f.java

这是我运行时获得的输出:

java -cp . SyncTest
Before Adding
Creating a TestBuffer
Before Remove
Broke Synchronization
1365192
Broke Synchronization
1365193
Broke Synchronization
1365194
Broke Synchronization
1365195
Broke Synchronization
1365196
Done
Run Code Online (Sandbox Code Playgroud)

更新:@Gray有一个最简单的例子,到目前为止.他的例子可以在这里找到:奇怪的JRC比赛条件

基于我从其他人那里获得的反馈,看起来问题可能发生在Windows 64和OSX上的Java 64位1.6.0_20-1.6.0_31(不确定更新的1.6.0)上.没有人能够在Java 7上重现该问题.它还可能需要多核机器来重现该问题.

原始问题:

我有一个类提供以下方法:

  • 删除 - 从列表中删除给定项目
  • getBuffer - 迭代列表中的所有项目

我把问题简化为下面的两个函数,这两个函数都在同一个对象中,它们都是synchronized.除非我弄错了,否则永远不应该打印"Broke Synchronization",因为在输入insideGetBuffer之前应始终将其设置为false remove.但是,在我的应用程序中,当我有1个线程调用重复删除而另一个重复调用getBuffer时,它正在打印"Broke Synchronization".症状是我得到了ConcurrentModificationException.

也可以看看:

非常奇怪的竞争条件,看起来像JRE问题

Sun Bug报告: …

java multithreading synchronization thread-safety

37
推荐指数
2
解决办法
4094
查看次数

为什么VisualVM Profiler不会配置我的应用程序?

我创建了一个简单的1文件java应用程序,它循环遍历循环,调用一些函数,分配一些内存,添加一些数字等.我通过eclipse运行该应用程序Run As->Java Application.

正在运行的应用程序出现在Java VisualVM下Local.

我双击该应用程序并转到Profiler选项卡.

默认设置为:

Start profiling from classes: my.main.package.**

Do not profile classes: java.*, javax.*, sun.*, sunw.*, com.sun.*

我点击CPU.的CPUMemory按钮变灰.什么都没发生.

Statusprofiling inactive.

当我的申请终止Statusapplication terminated.

我在这做错了什么?我需要调整一些设置吗?启动应用程序时是否需要设置VM标志?

java debugging profiling visualvm

31
推荐指数
2
解决办法
4万
查看次数

是否可以使Spring ApplicationListener监听2种或更多类型的事件?

我有两种不同类型的事件,我希望我的班级能够相应地(并且不同地)收听和处理.

我试过了: public class ListenerClass implements ApplicationListener<Foo>, ApplicationListener<Bar>

这给了我一个错误,你不能用不同的参数两次实现相同的接口.

如果没有实现ApplicationEvent的监听器(或Foo和Bar将实现的一些其他通用接口)并使用它instanceof来确定要采取的路径,我还有其他选择吗?

谢谢!

java events spring

25
推荐指数
1
解决办法
1万
查看次数

如何通过测试驱动开发确保安全编码?

我一直在加速测试驱动开发(TDD)的最新趋势.我所做的大部分开发都是用C或C++编写的.令我感到震惊的是,常见的TDD实践与常见的安全编码实践之间存在非常明显的冲突.在它的核心,TDD告诉你,你不应该为没有失败测试的东西编写新的代码.对我来说,这意味着我不应该编写安全代码,除非我有单元测试来查看我的代码是否安全.

这带来了两个问题:

  1. 如何有效地编写单元测试以测试缓冲区溢出,堆栈溢出,堆溢出,数组索引错误,格式化字符串错误,ANSI与Uni​​code与MBCS字符串大小错误匹配,安全字符串处理(来自Howard和LeBlanc的"编写安全代码") )?

  2. 在标准TDD实践的什么时候应该包括这些测试,因为大部分安全性都是非功能性的.

令人惊讶的是,我发现很少有研究讨论TDD和安全性.我遇到的大部分内容都是TDD论文,它们在很高的层次上提到TDD将"使您的代码更安全".

我正在寻找上述问题的任何直接答案,任何与此有关的研究(我看起来已经找不到太多),或者TDD大师的任何地方,所以我可以敲门(虚拟)和看看他们是否有任何好的答案.

谢谢!

编辑:

Fuzzing的主题已经出现,我认为这是解决这个问题的一个很好的方法(总的来说).这引出了一些问题:模糊测试是否适合TDD?在TDD过程中,模糊测试适合哪些?

参与式单元测试(可能是自动化的)也让我想到了.这可能是一种在测试过程中早期获得模糊测试结果的方法.我不确定它在哪里适合TDD.

编辑2:

到目前为止,谢谢大家的答案.在这一点上,我对如何利用参数化测试作为我们的函数的伪模糊器非常感兴趣.但是,我们如何确定要测试安全性的测试?我们怎样才能确定我们能够充分覆盖攻击空间?

软件安全中一个众所周知的问题是,如果您防范5种攻击情形,攻击者只会查找并使用第6次攻击.这是一个非常困难的猫捉老鼠游戏.TDD是否给我们带来了任何优势?

security testing tdd unit-testing fuzzing

21
推荐指数
2
解决办法
1792
查看次数

我可以确保我的一个Spring ApplicationListener最后执行吗?

我有几个服务正在侦听Spring事件以更改我的基础数据模型.这些都通过实施来完成ApplicationListener<Foo>.一旦所有Foo侦听器修改了底层数据模型,我的用户界面就需要刷新以反映更改(想想fireTableDataChanged()).

有没有办法确保特定的听众Foo始终是最后的?或者有没有办法在所有其他听众完成后调用函数?我正在使用基于注释的布线和Java配置,如果这很重要的话.

java spring dependency-injection event-handling

18
推荐指数
1
解决办法
4745
查看次数

将场景渲染到帧缓冲区对象(FBO)然后将该FBO渲染到屏幕所需的步骤是什么?

我有一个相当复杂的场景,我需要渲染许多GL_POINTS.场景将基本上是静态的,所以我想将它渲染到Framebuffer对象,然后只在场景实际发生变化时更新FBO.然后,我想将FBO渲染到每一帧的屏幕上.

我找到了将FBO渲染为纹理的示例.我找到了将FBO渲染成RenderBuffer的例子(仍不太确定是什么).我不确定实现这一目标的步骤是什么.我是否需要渲染到纹理并将纹理绘制到屏幕上?

你可以列举一下步骤(理想情况下甚至是伪代码或实际代码)来将我的场景渲染到FBO然后将FBO绘制到屏幕上.

draw() 对于我自己的绘图功能的占位符来说已经足够了.

opengl 3d graphics jogl

9
推荐指数
1
解决办法
9032
查看次数

使用JDBC捕获和处理ORA-00001 SQLException的正确方法是什么?

我正在创建一个简单的表单,使用JDBC通过Java Servlet将输入的数据存储在一个非常简单的Oracle数据库表中.该表使用电子邮件地址作为主键.如果用户使用相同的电子邮件地址多次提交表单,则该execute函数将失败并抛出SQLException.异常的字符串如下:

java.sql.SQLException: ORA-00001: unique constraint (...removed...) violated
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想通过告诉用户使用相同的电子邮件地址多次提交表单来捕获此异常并处理它.什么是单独处理ORA-00001的正确方法,与可以抛出的任何其他SQLExceptions不同execute?字符串比较显然可以在这里工作,但这似乎是一个糟糕的解决方案.

oracle constraints jdbc primary-key ora-00001

7
推荐指数
1
解决办法
8674
查看次数

为什么java.awt.Point提供了设置和获取双精度的方法,但是将x和y存储为int?

正如您在Oracle Documentation for java.awt.Point中看到的那样,x和y存储为int.但是,getXgetY返回double.虽然有一种setLocation方法需要2 double种类型,但没有构造函数可以执行.此外,无论如何double都会被截断到int内部.

有这么好的理由吗?你可能会避免投上setLocation由具有采取的方法double类型,但是当你打电话给你有相反的问题getXgetY.通过返回doublefrom getX和,也会错误地表示Point类的精度getY.

java precision point awt

7
推荐指数
1
解决办法
1721
查看次数

是否可以从Solr 4.x直接升级到Solr 6.1?

我们期待从SolrCloud 4.10.3升级到SolrCloud 6.1.Solr 6.1的文档在向后兼容性方面不是很清楚.

我在LucidWorks网站上看过这篇文章.

索引格式在两个连续的主要Solr版本之间向后兼容.所以Solr 3.x索引与Solr 4.x索引兼容.但是,如果您有Solr 1.x索引并希望升级到Solr 4.x,则需要先升级到Solr 3.x.

它是在Solr 6.x出局之前编写的,"两个连续的主要Solr版本之间"的措辞不清楚.该示例跳过我感兴趣的确切场景(正好跳过1个主要版本).

我是否必须首先升级到Solr 5.x然后转到Solr 6.1?

lucene solr solrcloud

6
推荐指数
2
解决办法
4330
查看次数

适用于Java的Google财经风格控件?

我想创建一个时间轴,您可以在其中查看概述并放大时间轴的某些部分以获取更多详细信息.基本上,我想要谷歌财经有什么.

那里有什么可以提供这个,或者至少让我接近?我正在使用Swing和SwingX作为我的GUI组件.

java user-interface charts swing

5
推荐指数
1
解决办法
226
查看次数

是否可以在每个jar文件中使用弹簧配置XML文件以及其他信息?

我的主要Spring配置XML文件指定了这样的内容:

<context:component-scan base-package="com.application" />

在此扫描期间找到的组件可以位于类路径中的许多jar文件之一.我希望能够在每个jar文件中有额外的spring配置XML文件,它们提供有关每个服务/组件的更多信息(可能是一些属性和诸如此类的东西),但我不希望这些东西与我的紧密耦合主应用程序的配置文件.

有办法做到这一点,还是我运气不好?

理想情况下,我希望能够根据JAR文件中的名称和/或位置以某种方式自动检测JAR文件中XML文件的存在.

我知道有些事情可以通过META-INF完成,但这远远超出了我的专业领域.

java configuration plugins spring configuration-files

4
推荐指数
1
解决办法
3435
查看次数

是否有任何好的技术可以保持几乎排序的近乎排序的数据?

精简版:

我正在寻找一种技术来保持几乎排序的数据随着时间的推移几乎排序,尽管值略有变化.

这是场景:

在3D图形世界中,在绘制之前从前到后订购对象通常是有益的.当场景发生变化或场景视图发生变化时,此数据可能需要重新排序,但通常非常接近排序顺序(即帧之间不会发生很大变化).数据完全按排序顺序也并不重要.最糟糕的事情是渲染多边形然后完全隐藏.这是一个小小的性能打击,但不是世界末日.

考虑到这一点,是否可以提前对数据进行排序,然后每帧对数据应用一次最小补丁,以确保数据保持大部分排序?在这种情况下,如果大多数对象按升序排列,则数据将被视为主要排序.也就是说,1个对象,它是10步之遥,从它的正确位置是低于10级的对象是1步距离合适的位置更好(10倍更好).

值得注意的是,数据可以继续半定期修补,因为数据通常每秒渲染30次(左右).只要计算有效,它就可以继续进行,直到更改停止并且列表完全排序.

现有理念:

我对这个问题的膝跳反应是:

  1. n log n加载时对数据应用排序,以及对大量更改(我可以很容易地跟踪).

  2. 当数据开始缓慢变化时(例如当场景旋转时),对数据应用某种(线性)传递以交换向后的邻居并尝试维护排序顺序(我认为这基本上是shell排序 - 也许有一个更好的算法用于这个单程).

  3. 继续每帧进行一次局部排序,直到更改停止并且数据完全排序

  4. 返回步骤2并等待更多更改.

opengl sorting algorithm 3d data-structures

3
推荐指数
1
解决办法
189
查看次数

如何防止部署 Maven 创建的 ZIP 文件?

我使用 maven-dependency-plugin 收集应用程序的所有依赖项,然后使用 maven-assemble-plugin 将它们打包在 ZIP 文件中。这部分工作一切都很好。

但是,当我这样做时mvn deploy,它会将 ZIP 文件部署到我的 Archiva 服务器,这是我不想要的。我只想将 JAR 单独部署在那里。

有什么办法可以阻止 ZIP 文件的上传吗?

以下是我的 POM 的相关部分:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>${project.build.directory}/lib</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.3</version>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <finalName>myProject-${project.version}</finalName>
        <outputDirectory>../</outputDirectory>
        <descriptors>
          <descriptor>src/main/assembly/assembly.xml</descriptor>
        </descriptors>
      </configuration>
    </execution>
  </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

java maven maven-assembly-plugin maven-deploy-plugin

1
推荐指数
1
解决办法
1165
查看次数