小编Ste*_*ong的帖子

迭代ConcurrentHashMap值是否安全?

ConcurrentHashMap的 javadoc中有以下内容:

检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠.检索反映了最近完成的更新操作的结果.对于诸如putAll和clear之类的聚合操作,并发检索可能反映仅插入或删除某些条目.类似地,Iterators和Enumerations在迭代器/枚举的创建时或之后的某个时刻返回反映哈希表状态的元素.它们不会抛出ConcurrentModificationException.但是,迭代器设计为一次只能由一个线程使用.

这是什么意思?如果我尝试同时使用两个线程迭代地图会发生什么?如果我在迭代时从地图中添加或删除值会发生什么?

java concurrency multithreading thread-safety concurrenthashmap

144
推荐指数
5
解决办法
9万
查看次数

在Java中管理具有许多参数的构造函数

在我们的一些项目中,有一个类层次结构,它在链中向下添加更多参数.在底部,一些类可以有多达30个参数,其中28个只是被传递给超级构造函数.

我会承认,通过像Guice之类的东西使用自动化DI会很好,但由于某些技术原因,这些特定项目仅限于Java.

按类型按字母顺序组织参数的约定不起作用,因为如果某个类型被重构(您为参数2传入的圆现在是一个Shape),它可能会突然出现故障.

这个问题可能具体而且充满了"如果这是你的问题,你在设计层面做错了"的批评,但我只是在寻找任何观点.

java

99
推荐指数
4
解决办法
6万
查看次数

将float转换为double而不会丢失精度

我有一个原始的浮点数,我需要作为一个原始的双.简单地将浮子铸造成双倍会给我带来奇怪的额外精度.例如:

float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
Run Code Online (Sandbox Code Playgroud)

但是,如果不是强制转换,我将float作为字符串输出,并将字符串解析为double,我得到我想要的:

System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
Run Code Online (Sandbox Code Playgroud)

有没有比去String更好的方法呢?

java floating-point double

93
推荐指数
6
解决办法
20万
查看次数

Maven插件无法加载类

我正在尝试制作一个需要使用反射的maven插件.我想要一个项目来运行插件,并在项目中为它提供类的全名,插件将通过反射加载它以从中获取信息.

但是类加载器有些奇怪,因为它在我使用时找不到类

Class.forName("package.MyClass");
Run Code Online (Sandbox Code Playgroud)

看看这里,我无法弄清楚我的插件的类加载器,当在不同的项目中运行时,是否可以访问该项目的类.

maven-2 maven-plugin

15
推荐指数
3
解决办法
7397
查看次数

同一个IP但不同端口上的两个服务器之间的JSESSIONID冲突

我有一种情况,我在一台服务器上运行两个不同的webapps,使用不同的端口.它们都运行Java的Jetty servlet容器,因此它们都使用名为JSESSIONID的cookie参数来跟踪会话ID.这两个webapps正在争夺会话ID.

  • 打开Firefox选项卡,然后转到WebApp1
  • WebApp1的HTTP响应具有JSESSIONID = 1的set-cookie标头
  • Firefox现在在WebApp1的所有HTTP请求中都有一个带有JSESSIONID = 1的Cookie标头
  • 打开第二个Firefox选项卡,然后转到WebApp2
  • 对WebApp2的HTTP请求还有一个带JSESSIONID = 1的Cookie标头,但是在doGet中,当我打电话给req.getSession(false);我时null.如果我调用req.getSession(true)我得到一个新的Session对象,但是WebApp2的HTTP响应有一个带有JSESSIONID = 20的set-cookie头
  • 现在,WebApp2有一个工作会话,但WebApp1的会话已经消失.转到WebApp1会给我一个新的会话,吹走WebApp2的会话.
  • 永远继续

所以Sessions在每个网络应用程序之间徘徊.req.getSession(false)如果已经定义了JSESSIONID cookie,我真的希望返回一个有效的会话.

一种选择是基本上用HashMap和名为WEBAPP1SESSIONID和WEBAPP2SESSIONID的cookie重新实现Session框架,但这很糟糕,这意味着我必须将新的Session内容破解到ActionServlet和其他一些地方.

这一定是其他人遇到的问题.Jetty是不是HttpServletRequest.getSession(boolean)很糟糕?

java cookies http jetty

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

java.net.SocketTimeoutException:读取超时

我有一个客户端服务器架构的应用程序.客户端使用Java Web Start和Java Swing/AWT,sert使用HTTP服务器/ Servlet和Tomcat.通信是从对象的序列化中创建的,创建一个ObjectOutput序列化一个字节数组并分别发送到服务器并调用ObjectInputStream并反序列化.

应用程序遵循正确的并发通信时间,并开始显示错误"SocketException read timeout".当服务器在我的servlet doPost方法中调用方法ObjectInputStream.getObject()时,会发生错误.

tomcat将变慢并且错误开始减少服务器响应时间,直到我必须重新启动服务器并且一切正常后的崩溃时间.

有人经历过这个问题吗?

客户代码

URLConnection conn =  url.openConnection();
conn.setDoOutput(true);

OutputStream os = conn.getOutputStream();
ObjectOutputStream oss = new ObjectOutputStream(os);

oss.writeUTF("protocol header sample");

oss.writeObject(_parameters);
oss.flush();
oss.close();
Run Code Online (Sandbox Code Playgroud)

服务器代码

ObjectInputStream input = new ObjectInputStream(_request.getInputStream());
String method = input.readUTF();

parameters = input.readObject();
Run Code Online (Sandbox Code Playgroud)

input.readObject()是错误的位置

java sockets tomcat objectinputstream socketexception

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

Java二进制兼容性问题:sun.font.FontManager类成为接口

我正在使用Lobo - Java Web浏览器库,它给了我一个例外,经过一些研究后我确定可能是因为该库已经与旧版本的Java进行了编译.

代码如下:

import java.io.IOException;
import org.lobobrowser.html.UserAgentContext;
import org.lobobrowser.html.parser.DocumentBuilderImpl;
import org.lobobrowser.html.parser.InputSourceImpl;
import org.lobobrowser.html.test.SimpleUserAgentContext;
import org.xml.sax.SAXException;

public class Cobratest
{
    public static void main(String[] args) throws SAXException, IOException
    {
        UserAgentContext uAgent = new SimpleUserAgentContext();
        DocumentBuilderImpl docBuild = new DocumentBuilderImpl(uAgent);
        docBuild.parse(new InputSourceImpl("http://dic.amdz.com/"));
    }
}
Run Code Online (Sandbox Code Playgroud)

并且堆栈跟踪是:

 Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface sun.font.FontManager, but class was expected
    at org.lobobrowser.util.gui.FontFactory.createFont(FontFactory.java:210)
    at org.lobobrowser.util.gui.FontFactory.createFont_Impl(FontFactory.java:180)
    at org.lobobrowser.util.gui.FontFactory.createFont(FontFactory.java:127)
    at org.lobobrowser.util.gui.FontFactory.getFont(FontFactory.java:98)
    at org.lobobrowser.html.style.StyleSheetRenderState.<clinit>(StyleSheetRenderState.java:43)
    at org.lobobrowser.html.domimpl.NodeImpl.<clinit>(NodeImpl.java:39)
    at org.lobobrowser.html.parser.DocumentBuilderImpl.createDocument(DocumentBuilderImpl.java:143)
    at org.lobobrowser.html.parser.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:97)
Run Code Online (Sandbox Code Playgroud)

当我检查时,org.lobobrowser.util.gui.FontFactory.createFont我发现有一个FontManager名称从之前版本的Java改变了.在这个 …

java interface binary-compatibility

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

被排除的工件显示在依赖项中:树

我的项目依赖org.apache.pig:pig,但我不希望的传递依赖org.mortbay.jetty:jettyorg.mortbay.jetty:servlet-api.我添加了这两个工件,<excludes>但似乎不起作用:

mvn dependency:tree -Dincludes=org.mortbay.jetty:servlet-api
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'dependency'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - myGroupp:myArtifact:jar:1.0-SNAPSHOT
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] myGroupp:myArtifact:jar:1.0-SNAPSHOT
[INFO] \- org.apache.pig:pig:jar:0.10.0:compile
[INFO]    \- org.mortbay.jetty:jetty:jar:6.1.26:compile
[INFO]       \- org.mortbay.jetty:servlet-api:jar:2.5-20081211:compile
Run Code Online (Sandbox Code Playgroud)

简单展示pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>myGroupp</groupId>
  <artifactId>myArtifact</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>org.apache.pig</groupId>
      <artifactId>pig</artifactId>
      <version>0.10.0</version>
      <exclusions>
        <exclusion>
          <artifactId>org.mortbay.jetty</artifactId>
          <groupId>jetty</groupId>
        </exclusion>
        <exclusion>
          <artifactId>org.mortbay.jetty</artifactId>
          <groupId>servlet-api</groupId>
        </exclusion>
      </exclusions> …
Run Code Online (Sandbox Code Playgroud)

java maven

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

S3N和S3A distcp在Hadoop 2.6.0中不起作用

摘要

股票hadoop2.6.0安装给了我no filesystem for scheme: s3n.hadoop-aws.jar现在添加到类路径给了我ClassNotFoundException: org.apache.hadoop.fs.s3a.S3AFileSystem.

细节

我有一个大多数股票安装hadoop-2.6.0.我只设置目录,并设置以下环境变量:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/jre
export HADOOP_COMMON_HOME=/opt/hadoop
export HADOOP_HOME=$HADOOP_COMMON_HOME
export HADOOP_HDFS_HOME=$HADOOP_COMMON_HOME
export HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME
export HADOOP_OPTS=-XX:-PrintWarnings
export PATH=$PATH:$HADOOP_COMMON_HOME/bin
Run Code Online (Sandbox Code Playgroud)

hadoop classpath方法是:

/opt/hadoop/etc/hadoop:/opt/hadoop/share/hadoop/common/lib/*:/opt/hadoop/share/hadoop/common/*:/opt/hadoop/share/hadoop/hdfs:/opt/hadoop/share/hadoop/hdfs/lib/*:/opt/hadoop/share/hadoop/hdfs/*:/opt/hadoop/share/hadoop/yarn/lib/*:/opt/hadoop/share/hadoop/yarn/*:/opt/hadoop/share/hadoop/mapreduce/lib/*:/opt/hadoop/share/hadoop/mapreduce/*:/contrib/capacity-scheduler/*.jar:/opt/hadoop/share/hadoop/tools/lib/*
Run Code Online (Sandbox Code Playgroud)

当我试着奔跑时,hadoop distcp -update hdfs:///files/to/backup s3n://${S3KEY}:${S3SECRET}@bucket/files/to/backup我得到了Error: java.io.Exception, no filesystem for scheme: s3n.如果我使用s3a,我会得到同样的错误抱怨s3a.

互联网告诉我,hadoop-aws.jar是不是默认的类路径的一部分.我添加了以下行/opt/hadoop/etc/hadoop/hadoop-env.sh:

HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_COMMON_HOME/share/hadoop/tools/lib/*
Run Code Online (Sandbox Code Playgroud)

现在hadoop classpath附上以下内容:

:/opt/hadoop/share/hadoop/tools/lib/*
Run Code Online (Sandbox Code Playgroud)

这应该涵盖/opt/hadoop/share/hadoop/tools/lib/hadoop-aws-2.6.0.jar.现在我得到:

Caused by: java.lang.ClassNotFoundException:
Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
Run Code Online (Sandbox Code Playgroud)

jar文件包含无法找到的类:

unzip -l /opt/hadoop/share/hadoop/tools/lib/hadoop-aws-2.6.0.jar |grep S3AFileSystem
28349  2014-11-13 …
Run Code Online (Sandbox Code Playgroud)

hadoop amazon-s3 hadoop2

5
推荐指数
2
解决办法
7504
查看次数

可以从非空的UTF-8字节数组创建一个空的java字符串吗?

我正在尝试调试一些东西,我想知道以下代码是否能够返回true

public boolean impossible(byte[] myBytes) {
  if (myBytes.length == 0)
    return false;
  String string = new String(myBytes, "UTF-8");
  return string.length() == 0;
}
Run Code Online (Sandbox Code Playgroud)

我能传递的某些价值是否会返回真实?我已经摆弄了2字节序列的第一个字节,但它仍然产生一个字符串.

为了澄清,这发生在通过GCJ编译为原生二进制可执行文件的Java 1.4代码上的PowerPC芯片上.这基本上意味着大多数赌注都已关闭.我主要想知道Java的"正常"行为,或Java的规范是否做出了任何承诺.

java string utf-8

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

Python正则表达式匹配它不应该的字符串

我完全迷失了这个正则表达式如何匹配python中的这个字符串.有人能理解它吗?

import re
regex = "^PHP/5.\\{3|2\\}.\\{1|2|3|4|5|6|7|8|9|0\\}\\{1|2|3|4|5|6|7|8|9|0\\}$"
ua = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'
re.compile(regex).search(ua)
Run Code Online (Sandbox Code Playgroud)

正则表达式以PHP字符串开头,而字符串则没有.难道不应该仅仅取消比赛的资格吗?

python regex

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