我有几个问题Unsafe.park和Object.wait(及其相应的简历方法):
Unsafe.park结束有什么好处Object.wait吗?我正在尝试使用JDK9的新AOT功能编译应用程序服务器,并且面临着许多挑战.
应用程序服务器包含~180 MB的罐子; 编译一起溢出整数,所以我试图将每个模块编译成一个(.so)库.这些模块与其他模块有依赖关系,所以我不得不使用-J-cp -J依赖项将它们放在classpath上.这导致了4.4 GB的libs - 因为AOT应该加速服务器启动,你可以想象从磁盘加载它并没有真正帮助.(可以剥离那些调试信息的库,但我们仍然在讨论与罐子相比规模增长的顺序.)
我很沮丧,jaotc实际上类加载编译的类,它触发静态构造函数(这有时会给我错误).此外,编译器无法处理缺少的引用类,有时这只是一个运行时依赖 - 即使没有它们,服务器也可以正常运行.所以我必须提供空的模拟类来满足编译器.
但是,当使用AOT跟踪(-Xlog:aot+class+load=trace:file=/tmp/aot.txt:none而不是stdout -XX:+PrintAOT)运行服务器时,我发现libs也包含一些依赖项:
found java.lang.Object in /home/user/aot/common/libjava.base-coop.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found java.lang.Object in /home/user/aot/appserver/lib/libcom.example.module1.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found java.lang.Object in /home/user/aot/appserver/lib/libcom.example.module2.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
Run Code Online (Sandbox Code Playgroud)
这证实了我的疑问,lib只包含了我给编译器编译的jar中的代码,但至少包含了超类的代码.我也不确定JVM在多个库中找到相同类时的行为.
剥离重复是否可能?大/多库项目的推荐方法是什么?
我正在阅读 JDK 11 中的 LinkedHashMap 源代码,我发现了一段死代码(我不确定)
众所周知,LinkedHashMap 使用双向链表来保存所有元素的顺序。它有一个成员叫做 accessOrder
final boolean accessOrder;
Run Code Online (Sandbox Code Playgroud)
默认情况下它是 false,但如果它被设置为 true,每次运行时get,它都会将它到达的元素移动到链表的末尾。这就是函数afterNodeAccess所做的。
//if accessOrder were set as true, after you visit node e, if e is not the end node of the linked list,
//it will move the node to the end of the linkedlist.
void afterNodeAccess(Node<K, V> e) {
LinkedHashMap.Entry<K, V> last;
if(accessOrder && (last = tail) != e) {
//if enter `if` ?it indicates that e is not the end of …Run Code Online (Sandbox Code Playgroud) 有没有办法Eclipse Mars JDT强制执行新的,更严格的JDK8"doclint"标准,以便Eclipse中的错误级别与javadoc工具匹配?
似乎有很多关于禁用Linter的文章,但我想反过来说:保持开启并"修复"我的javadoc注释.
Eclipse中似乎没有任何合规性设置来强制执行某些规则,例如使用HTML实体而不是<和>文字,标记结束规则,禁止XHTML样式自关闭标记等.
我一般对Java-11感到好奇,但特别是JEP:323计划将var声明添加到Lambda操作变量.
这个功能背后的动机在这里很好地讨论.请考虑以下文章中的引用:
// #1 - Legal
ITest divide = (@ATest var x, final var y) -> x / y;
/* #2 Modifiers on Old-Style implicit paramaters => Illegal */
ITest divide = (@ATest x, final y) -> x / y;
Run Code Online (Sandbox Code Playgroud)
最终修饰符的使用对我来说很清楚,并且符合不变性最佳实践.
但是,我不确定注释.能够注释lambda隐式参数有什么好处?
你能提供一个在lambda操作变量上使用注释的事实上的有益例子吗?这不是一个意见问题,而是作为使用此功能时更具可读性或效率的代码的实际示例.
作为一个单独的开发人员,我是否可以为Android手机编写一个操作系统,可以打开一个徽标并有一个简单的屏幕键盘用于文本输入,接收文本命令并可以自拍并保存它们?我该如何构建它以及需要多长时间?
我有一个这样的树结构:一个模型有一个根节点,每个节点有任意数量的子节点和任意数量的网格.
在我的应用程序中,很多时候都花费遍历这个树并进行计算,如视图截顶剔除和矩阵乘法.目前,它是天真地实现的,其中每个节点具有子节点和网格的向量,并且递归地遍历树.这很慢.
我一直在关注面向数据的设计,我喜欢它对缓存非常友好的想法.我一直在想这样的事情:
struct Mesh
{
// misc data
MeshID mMeshID;
}
// probably needs more information?
struct Node
{
// begin and end index into Models 'mNodes'
uint32_t mChildrenBegin;
uint32_t mChildrenEnd;
// as above but for meshes
uint32_t mMeshesBegin;
uint32_t mMeshesEnd;
}
struct Model
{
std::vector<Node> mNodes;
std::vector<Mesh> mMeshes;
}
Run Code Online (Sandbox Code Playgroud)
现在我需要遍历树以获得可见网格列表.在每个节点,我必须检查节点是否可见.以下分支机构:
树是静态的.在应用程序中加载模型后,树永远不会更改.所以我必须能够使用这些信息来获得有效的结构.
我很困惑如何处理这个问题.
几个问题;
在C++中,当从构造函数中调用虚函数时,它的行为不像虚函数.
我认为第一次遇到这种行为的每个人都感到惊讶,但第二次认为这是有意义的:
只要派生的构造函数没有被执行的对象是不是又一个衍生实例.
那么如何调用派生函数呢?前提条件没有机会建立.例:
class base {
public:
base()
{
std::cout << "foo is " << foo() << std::endl;
}
virtual int foo() { return 42; }
};
class derived : public base {
int* ptr_;
public:
derived(int i) : ptr_(new int(i*i)) { }
// The following cannot be called before derived::derived due to how C++ behaves,
// if it was possible... Kaboom!
virtual int foo() { return *ptr_; }
};
Run Code Online (Sandbox Code Playgroud)
它与Java和.NET完全相同,但他们选择了另一种方式,并且可能是最不惊讶原则的唯一原因?
你认为哪个是正确的选择?
我正在为一家生产礼品卡代码的公司工作,该代码可用于在网上商店支付货款.
我想知道生成这些礼品卡代码最安全的方法是什么.长度需要是16个字符(虽然可以协商)并且可以是字母数字(虽然数字会更加客户友好).
从我所看到的,最安全的方法是使用以下Java代码生成特定长度的礼品卡代码:
static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static SecureRandom rnd = new SecureRandom();
String randomString( int len ){
StringBuilder sb = new StringBuilder( len );
for( int i = 0; i < len; i++ )
sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
这取自这里的答案.我从字符串中删除了小写字母,使其更加用户友好.所以这产生了36 ^ 16种组合.单独的数字将是10 ^ 16种组合.我认为数字本身就够了,但经常强调,鉴于礼品卡欺诈越来越普遍,字符串应该是字母数字.
这就是问题一:数字还是字母数字?
当用户使用在线商店的礼品卡支付商品时,我们会拨打电话,返回该礼品卡的余额和货币.鉴于礼品卡代码是在第三方服务器上输入的,现在这些礼品卡可供有权访问这些服务器的人使用.在用户部分兑换之后仍然存在余额的情况下,这显然是一个问题.
一种选择是,当我们调用我们的API(使用礼品卡代码)以获得余额时,我们返回并在他们的商店中保存一个随机字符串,只有当他们向我们开帐单时才能由在线商店使用 - 我们会将其与我们系统上的礼品卡代码相匹配.问题可能是用户在结账时输入的礼品卡代码会记录在他们的日志中的某个位置,任何有权访问这些日志的人都可以访问.
另一个选择是我们在部分兑换后刷新礼品卡代码.因此,用户基本上获得了用于余额的新礼品卡代码,并且前一个被取消.这可能是最安全的,但不是那么用户友好.
这就是第二个问题:我们如何确保仅部分兑换的礼品卡代码仍然有价值?
创建deb包时,我在哪里编写手册?是否有任何格式规则/最佳实践要尊重?
我对deb包的创建很新.在一些教程之后,我刚刚创建了一个安装/执行良好的软件包,所以现在我想编写一些文档,以便man myFancyPackage返回一些内容,而不是myFancyPackage的手动输入.
不幸的是,我找到的所有教程都没有谈到手动创建.